)]}'
{"version": 3, "sources": ["/web/static/lib/ace/ace.js", "/web/static/lib/ace/mode-javascript.js", "/web/static/lib/ace/mode-xml.js", "/web/static/lib/ace/mode-qweb.js", "/web/static/lib/ace/mode-python.js", "/web/static/lib/ace/mode-scss.js", "/web/static/lib/ace/theme-monokai.js"], "mappings": "AAAA;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACv9uBA;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACrpCA;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC3nBA;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC/IA;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACvoBA;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACtkCA;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA", "sourcesContent": ["/* ***** 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/**\n * Define a module along with a payload\n * @param module a name for the payload\n * @param payload a function to call with (require, exports, module) params\n */\n\n(function () {\n  var ACE_NAMESPACE = \"\";\n\n  var global = (function () {\n    return this;\n  })();\n  if (!global && typeof window != \"undefined\") global = window; // strict mode\n\n  if (!ACE_NAMESPACE && typeof requirejs !== \"undefined\") return;\n\n  var define = function (module, deps, payload) {\n    if (typeof module !== \"string\") {\n      if (define.original) define.original.apply(this, arguments);\n      else {\n        console.error(\"dropping module because define wasn't a string.\");\n        console.trace();\n      }\n      return;\n    }\n    if (arguments.length == 2) payload = deps;\n    if (!define.modules[module]) {\n      define.payloads[module] = payload;\n      define.modules[module] = null;\n    }\n  };\n\n  define.modules = {};\n  define.payloads = {};\n\n  /**\n   * Get at functionality define()ed using the function above\n   */\n  var _require = function (parentId, module, callback) {\n    if (typeof module === \"string\") {\n      var payload = lookup(parentId, module);\n      if (payload != undefined) {\n        callback && callback();\n        return payload;\n      }\n    } else if (Object.prototype.toString.call(module) === \"[object Array]\") {\n      var params = [];\n      for (var i = 0, l = module.length; i < l; ++i) {\n        var dep = lookup(parentId, module[i]);\n        if (dep == undefined && require.original) return;\n        params.push(dep);\n      }\n      return (callback && callback.apply(null, params)) || true;\n    }\n  };\n\n  var require = function (module, callback) {\n    var packagedModule = _require(\"\", module, callback);\n    if (packagedModule == undefined && require.original)\n      return require.original.apply(this, arguments);\n    return packagedModule;\n  };\n\n  var normalizeModule = function (parentId, moduleName) {\n    // normalize plugin requires\n    if (moduleName.indexOf(\"!\") !== -1) {\n      var chunks = moduleName.split(\"!\");\n      return (\n        normalizeModule(parentId, chunks[0]) +\n        \"!\" +\n        normalizeModule(parentId, chunks[1])\n      );\n    }\n    // normalize relative requires\n    if (moduleName.charAt(0) == \".\") {\n      var base = parentId.split(\"/\").slice(0, -1).join(\"/\");\n      moduleName = base + \"/\" + moduleName;\n\n      while (moduleName.indexOf(\".\") !== -1 && previous != moduleName) {\n        var previous = moduleName;\n        moduleName = moduleName\n          .replace(/\\/\\.\\//, \"/\")\n          .replace(/[^\\/]+\\/\\.\\.\\//, \"\");\n      }\n    }\n    return moduleName;\n  };\n\n  /**\n   * Internal function to lookup moduleNames and resolve them by calling the\n   * definition function if needed.\n   */\n  var lookup = function (parentId, moduleName) {\n    moduleName = normalizeModule(parentId, moduleName);\n\n    var module = define.modules[moduleName];\n    if (!module) {\n      module = define.payloads[moduleName];\n      if (typeof module === \"function\") {\n        var exports = {};\n        var mod = {\n          id: moduleName,\n          uri: \"\",\n          exports: exports,\n          packaged: true,\n        };\n\n        var req = function (module, callback) {\n          return _require(moduleName, module, callback);\n        };\n\n        var returnValue = module(req, exports, mod);\n        exports = returnValue || mod.exports;\n        define.modules[moduleName] = exports;\n        delete define.payloads[moduleName];\n      }\n      module = define.modules[moduleName] = exports || module;\n    }\n    return module;\n  };\n\n  function exportAce(ns) {\n    var root = global;\n    if (ns) {\n      if (!global[ns]) global[ns] = {};\n      root = global[ns];\n    }\n\n    if (!root.define || !root.define.packaged) {\n      define.original = root.define;\n      root.define = define;\n      root.define.packaged = true;\n    }\n\n    if (!root.require || !root.require.packaged) {\n      require.original = root.require;\n      root.require = require;\n      root.require.packaged = true;\n    }\n  }\n\n  exportAce(ACE_NAMESPACE);\n})();\n\ndefine(\"ace/lib/es6-shim\", [\"require\", \"exports\", \"module\"], function (\n  require,\n  exports,\n  module,\n) {\n  function defineProp(obj, name, val) {\n    Object.defineProperty(obj, name, {\n      value: val,\n      enumerable: false,\n      writable: true,\n      configurable: true,\n    });\n  }\n  if (!String.prototype.startsWith) {\n    defineProp(\n      String.prototype,\n      \"startsWith\",\n      function (searchString, position) {\n        position = position || 0;\n        return this.lastIndexOf(searchString, position) === position;\n      },\n    );\n  }\n  if (!String.prototype.endsWith) {\n    defineProp(String.prototype, \"endsWith\", function (searchString, position) {\n      var subjectString = this;\n      if (position === undefined || position > subjectString.length) {\n        position = subjectString.length;\n      }\n      position -= searchString.length;\n      var lastIndex = subjectString.indexOf(searchString, position);\n      return lastIndex !== -1 && lastIndex === position;\n    });\n  }\n  if (!String.prototype.repeat) {\n    defineProp(String.prototype, \"repeat\", function (count) {\n      var result = \"\";\n      var string = this;\n      while (count > 0) {\n        if (count & 1) result += string;\n        if ((count >>= 1)) string += string;\n      }\n      return result;\n    });\n  }\n  if (!String.prototype.includes) {\n    defineProp(String.prototype, \"includes\", function (str, position) {\n      return this.indexOf(str, position) != -1;\n    });\n  }\n  if (!Object.assign) {\n    Object.assign = function (target) {\n      if (target === undefined || target === null) {\n        throw new TypeError(\"Cannot convert undefined or null to object\");\n      }\n      var output = Object(target);\n      for (var index = 1; index < arguments.length; index++) {\n        var source = arguments[index];\n        if (source !== undefined && source !== null) {\n          Object.keys(source).forEach(function (key) {\n            output[key] = source[key];\n          });\n        }\n      }\n      return output;\n    };\n  }\n  if (!Object.values) {\n    Object.values = function (o) {\n      return Object.keys(o).map(function (k) {\n        return o[k];\n      });\n    };\n  }\n  if (!Array.prototype.find) {\n    defineProp(Array.prototype, \"find\", function (predicate) {\n      var len = this.length;\n      var thisArg = arguments[1];\n      for (var k = 0; k < len; k++) {\n        var kValue = this[k];\n        if (predicate.call(thisArg, kValue, k, this)) {\n          return kValue;\n        }\n      }\n    });\n  }\n  if (!Array.prototype.findIndex) {\n    defineProp(Array.prototype, \"findIndex\", function (predicate) {\n      var len = this.length;\n      var thisArg = arguments[1];\n      for (var k = 0; k < len; k++) {\n        var kValue = this[k];\n        if (predicate.call(thisArg, kValue, k, this)) {\n          return k;\n        }\n      }\n    });\n  }\n  if (!Array.prototype.includes) {\n    defineProp(Array.prototype, \"includes\", function (item, position) {\n      return this.indexOf(item, position) != -1;\n    });\n  }\n  if (!Array.prototype.fill) {\n    defineProp(Array.prototype, \"fill\", function (value) {\n      var O = this;\n      var len = O.length >>> 0;\n      var start = arguments[1];\n      var relativeStart = start >> 0;\n      var k =\n        relativeStart < 0\n          ? Math.max(len + relativeStart, 0)\n          : Math.min(relativeStart, len);\n      var end = arguments[2];\n      var relativeEnd = end === undefined ? len : end >> 0;\n      var final =\n        relativeEnd < 0\n          ? Math.max(len + relativeEnd, 0)\n          : Math.min(relativeEnd, len);\n      while (k < final) {\n        O[k] = value;\n        k++;\n      }\n      return O;\n    });\n  }\n  if (!Array.of) {\n    defineProp(Array, \"of\", function () {\n      return Array.prototype.slice.call(arguments);\n    });\n  }\n});\n\ndefine(\"ace/lib/fixoldbrowsers\", [\n  \"require\",\n  \"exports\",\n  \"module\",\n  \"ace/lib/es6-shim\",\n], function (require, exports, module) {\n  // vim:set ts=4 sts=4 sw=4 st:\n  \"use strict\";\n  require(\"./es6-shim\");\n});\n\ndefine(\"ace/lib/deep_copy\", [\"require\", \"exports\", \"module\"], function (\n  require,\n  exports,\n  module,\n) {\n  exports.deepCopy = function deepCopy(obj) {\n    if (typeof obj !== \"object\" || !obj) return obj;\n    var copy;\n    if (Array.isArray(obj)) {\n      copy = [];\n      for (var key = 0; key < obj.length; key++) {\n        copy[key] = deepCopy(obj[key]);\n      }\n      return copy;\n    }\n    if (Object.prototype.toString.call(obj) !== \"[object Object]\") return obj;\n    copy = {};\n    for (var key in obj) copy[key] = deepCopy(obj[key]);\n    return copy;\n  };\n});\n\ndefine(\"ace/lib/lang\", [\n  \"require\",\n  \"exports\",\n  \"module\",\n  \"ace/lib/deep_copy\",\n], function (require, exports, module) {\n  \"use strict\";\n  exports.last = function (a) {\n    return a[a.length - 1];\n  };\n  exports.stringReverse = function (string) {\n    return string.split(\"\").reverse().join(\"\");\n  };\n  exports.stringRepeat = function (string, count) {\n    var result = \"\";\n    while (count > 0) {\n      if (count & 1) result += string;\n      if ((count >>= 1)) string += string;\n    }\n    return result;\n  };\n  var trimBeginRegexp = /^\\s\\s*/;\n  var trimEndRegexp = /\\s\\s*$/;\n  exports.stringTrimLeft = function (string) {\n    return string.replace(trimBeginRegexp, \"\");\n  };\n  exports.stringTrimRight = function (string) {\n    return string.replace(trimEndRegexp, \"\");\n  };\n  exports.copyObject = function (obj) {\n    var copy = {};\n    for (var key in obj) {\n      copy[key] = obj[key];\n    }\n    return copy;\n  };\n  exports.copyArray = function (array) {\n    var copy = [];\n    for (var i = 0, l = array.length; i < l; i++) {\n      if (array[i] && typeof array[i] == \"object\")\n        copy[i] = this.copyObject(array[i]);\n      else copy[i] = array[i];\n    }\n    return copy;\n  };\n  exports.deepCopy = require(\"./deep_copy\").deepCopy;\n  exports.arrayToMap = function (arr) {\n    var map = {};\n    for (var i = 0; i < arr.length; i++) {\n      map[arr[i]] = 1;\n    }\n    return map;\n  };\n  exports.createMap = function (props) {\n    var map = Object.create(null);\n    for (var i in props) {\n      map[i] = props[i];\n    }\n    return map;\n  };\n  exports.arrayRemove = function (array, value) {\n    for (var i = 0; i <= array.length; i++) {\n      if (value === array[i]) {\n        array.splice(i, 1);\n      }\n    }\n  };\n  exports.escapeRegExp = function (str) {\n    return str.replace(/([.*+?^${}()|[\\]\\/\\\\])/g, \"\\\\$1\");\n  };\n  exports.escapeHTML = function (str) {\n    return (\"\" + str)\n      .replace(/&/g, \"&#38;\")\n      .replace(/\"/g, \"&#34;\")\n      .replace(/'/g, \"&#39;\")\n      .replace(/</g, \"&#60;\");\n  };\n  exports.getMatchOffsets = function (string, regExp) {\n    var matches = [];\n    string.replace(regExp, function (str) {\n      matches.push({\n        offset: arguments[arguments.length - 2],\n        length: str.length,\n      });\n    });\n    return matches;\n  };\n  exports.deferredCall = function (fcn) {\n    var timer = null;\n    var callback = function () {\n      timer = null;\n      fcn();\n    };\n    var deferred = function (timeout) {\n      deferred.cancel();\n      timer = setTimeout(callback, timeout || 0);\n      return deferred;\n    };\n    deferred.schedule = deferred;\n    deferred.call = function () {\n      this.cancel();\n      fcn();\n      return deferred;\n    };\n    deferred.cancel = function () {\n      clearTimeout(timer);\n      timer = null;\n      return deferred;\n    };\n    deferred.isPending = function () {\n      return timer;\n    };\n    return deferred;\n  };\n  exports.delayedCall = function (fcn, defaultTimeout) {\n    var timer = null;\n    var callback = function () {\n      timer = null;\n      fcn();\n    };\n    var _self = function (timeout) {\n      if (timer == null)\n        timer = setTimeout(callback, timeout || defaultTimeout);\n    };\n    _self.delay = function (timeout) {\n      timer && clearTimeout(timer);\n      timer = setTimeout(callback, timeout || defaultTimeout);\n    };\n    _self.schedule = _self;\n    _self.call = function () {\n      this.cancel();\n      fcn();\n    };\n    _self.cancel = function () {\n      timer && clearTimeout(timer);\n      timer = null;\n    };\n    _self.isPending = function () {\n      return timer;\n    };\n    return _self;\n  };\n  exports.supportsLookbehind = function () {\n    try {\n      new RegExp(\"(?<=.)\");\n    } catch (e) {\n      return false;\n    }\n    return true;\n  };\n  exports.skipEmptyMatch = function (line, last, supportsUnicodeFlag) {\n    return supportsUnicodeFlag && line.codePointAt(last) > 0xffff ? 2 : 1;\n  };\n});\n\ndefine(\"ace/lib/useragent\", [\"require\", \"exports\", \"module\"], function (\n  require,\n  exports,\n  module,\n) {\n  \"use strict\";\n  exports.OS = {\n    LINUX: \"LINUX\",\n    MAC: \"MAC\",\n    WINDOWS: \"WINDOWS\",\n  };\n  exports.getOS = function () {\n    if (exports.isMac) {\n      return exports.OS.MAC;\n    } else if (exports.isLinux) {\n      return exports.OS.LINUX;\n    } else {\n      return exports.OS.WINDOWS;\n    }\n  };\n  var _navigator = typeof navigator == \"object\" ? navigator : {};\n  var os = (/mac|win|linux/i.exec(_navigator.platform) || [\n    \"other\",\n  ])[0].toLowerCase();\n  var ua = _navigator.userAgent || \"\";\n  var appName = _navigator.appName || \"\";\n  exports.isWin = os == \"win\";\n  exports.isMac = os == \"mac\";\n  exports.isLinux = os == \"linux\";\n  exports.isIE =\n    appName == \"Microsoft Internet Explorer\" ||\n    appName.indexOf(\"MSAppHost\") >= 0\n      ? parseFloat(\n          (ua.match(\n            /(?:MSIE |Trident\\/[0-9]+[\\.0-9]+;.*rv:)([0-9]+[\\.0-9]+)/,\n          ) || [])[1],\n        )\n      : parseFloat(\n          (ua.match(/(?:Trident\\/[0-9]+[\\.0-9]+;.*rv:)([0-9]+[\\.0-9]+)/) ||\n            [])[1],\n        ); // for ie\n  exports.isOldIE = exports.isIE && exports.isIE < 9;\n  exports.isGecko = exports.isMozilla = ua.match(/ Gecko\\/\\d+/);\n  exports.isOpera =\n    typeof opera == \"object\" &&\n    Object.prototype.toString.call(window[\"opera\"]) == \"[object Opera]\";\n  exports.isWebKit = parseFloat(ua.split(\"WebKit/\")[1]) || undefined;\n  exports.isChrome = parseFloat(ua.split(\" Chrome/\")[1]) || undefined;\n  exports.isSafari =\n    (parseFloat(ua.split(\" Safari/\")[1]) && !exports.isChrome) || undefined;\n  exports.isEdge = parseFloat(ua.split(\" Edge/\")[1]) || undefined;\n  exports.isAIR = ua.indexOf(\"AdobeAIR\") >= 0;\n  exports.isAndroid = ua.indexOf(\"Android\") >= 0;\n  exports.isChromeOS = ua.indexOf(\" CrOS \") >= 0;\n  exports.isIOS = /iPad|iPhone|iPod/.test(ua) && !window[\"MSStream\"];\n  if (exports.isIOS) exports.isMac = true;\n  exports.isMobile = exports.isIOS || exports.isAndroid;\n});\n\ndefine(\"ace/lib/dom\", [\n  \"require\",\n  \"exports\",\n  \"module\",\n  \"ace/lib/useragent\",\n], function (require, exports, module) {\n  \"use strict\";\n  var useragent = require(\"./useragent\");\n  var XHTML_NS = \"http://www.w3.org/1999/xhtml\";\n  exports.buildDom = function buildDom(arr, parent, refs) {\n    if (typeof arr == \"string\" && arr) {\n      var txt = document.createTextNode(arr);\n      if (parent) parent.appendChild(txt);\n      return txt;\n    }\n    if (!Array.isArray(arr)) {\n      if (arr && arr.appendChild && parent) parent.appendChild(arr);\n      return arr;\n    }\n    if (typeof arr[0] != \"string\" || !arr[0]) {\n      var els = [];\n      for (var i = 0; i < arr.length; i++) {\n        var ch = buildDom(arr[i], parent, refs);\n        ch && els.push(ch);\n      }\n      return els;\n    }\n    var el = document.createElement(arr[0]);\n    var options = arr[1];\n    var childIndex = 1;\n    if (options && typeof options == \"object\" && !Array.isArray(options))\n      childIndex = 2;\n    for (var i = childIndex; i < arr.length; i++) buildDom(arr[i], el, refs);\n    if (childIndex == 2) {\n      Object.keys(options).forEach(function (n) {\n        var val = options[n];\n        if (n === \"class\") {\n          el.className = Array.isArray(val) ? val.join(\" \") : val;\n        } else if (typeof val == \"function\" || n == \"value\" || n[0] == \"$\") {\n          el[n] = val;\n        } else if (n === \"ref\") {\n          if (refs) refs[val] = el;\n        } else if (n === \"style\") {\n          if (typeof val == \"string\") el.style.cssText = val;\n        } else if (val != null) {\n          el.setAttribute(n, val);\n        }\n      });\n    }\n    if (parent) parent.appendChild(el);\n    return el;\n  };\n  exports.getDocumentHead = function (doc) {\n    if (!doc) doc = document;\n    return (\n      doc.head || doc.getElementsByTagName(\"head\")[0] || doc.documentElement\n    );\n  };\n  exports.createElement = function (tag, ns) {\n    return document.createElementNS\n      ? document.createElementNS(ns || XHTML_NS, tag)\n      : document.createElement(tag);\n  };\n  exports.removeChildren = function (element) {\n    element.innerHTML = \"\";\n  };\n  exports.createTextNode = function (textContent, element) {\n    var doc = element ? element.ownerDocument : document;\n    return doc.createTextNode(textContent);\n  };\n  exports.createFragment = function (element) {\n    var doc = element ? element.ownerDocument : document;\n    return doc.createDocumentFragment();\n  };\n  exports.hasCssClass = function (el, name) {\n    var classes = (el.className + \"\").split(/\\s+/g);\n    return classes.indexOf(name) !== -1;\n  };\n  exports.addCssClass = function (el, name) {\n    if (!exports.hasCssClass(el, name)) {\n      el.className += \" \" + name;\n    }\n  };\n  exports.removeCssClass = function (el, name) {\n    var classes = el.className.split(/\\s+/g);\n    while (true) {\n      var index = classes.indexOf(name);\n      if (index == -1) {\n        break;\n      }\n      classes.splice(index, 1);\n    }\n    el.className = classes.join(\" \");\n  };\n  exports.toggleCssClass = function (el, name) {\n    var classes = el.className.split(/\\s+/g),\n      add = true;\n    while (true) {\n      var index = classes.indexOf(name);\n      if (index == -1) {\n        break;\n      }\n      add = false;\n      classes.splice(index, 1);\n    }\n    if (add) classes.push(name);\n    el.className = classes.join(\" \");\n    return add;\n  };\n  exports.setCssClass = function (node, className, include) {\n    if (include) {\n      exports.addCssClass(node, className);\n    } else {\n      exports.removeCssClass(node, className);\n    }\n  };\n  exports.hasCssString = function (id, doc) {\n    var index = 0,\n      sheets;\n    doc = doc || document;\n    if ((sheets = doc.querySelectorAll(\"style\"))) {\n      while (index < sheets.length) {\n        if (sheets[index++].id === id) {\n          return true;\n        }\n      }\n    }\n  };\n  exports.removeElementById = function (id, doc) {\n    doc = doc || document;\n    if (doc.getElementById(id)) {\n      doc.getElementById(id).remove();\n    }\n  };\n  var strictCSP;\n  var cssCache = [];\n  exports.useStrictCSP = function (value) {\n    strictCSP = value;\n    if (value == false) insertPendingStyles();\n    else if (!cssCache) cssCache = [];\n  };\n  function insertPendingStyles() {\n    var cache = cssCache;\n    cssCache = null;\n    cache &&\n      cache.forEach(function (item) {\n        importCssString(item[0], item[1]);\n      });\n  }\n  function importCssString(cssText, id, target) {\n    if (typeof document == \"undefined\") return;\n    if (cssCache) {\n      if (target) {\n        insertPendingStyles();\n      } else if (target === false) {\n        return cssCache.push([cssText, id]);\n      }\n    }\n    if (strictCSP) return;\n    var container = target;\n    if (!target || !target.getRootNode) {\n      container = document;\n    } else {\n      container = target.getRootNode();\n      if (!container || container == target) container = document;\n    }\n    var doc = container.ownerDocument || container;\n    if (id && exports.hasCssString(id, container)) return null;\n    if (id) cssText += \"\\n/*# sourceURL=ace/css/\" + id + \" */\";\n    var style = exports.createElement(\"style\");\n    style.appendChild(doc.createTextNode(cssText));\n    if (id) style.id = id;\n    if (container == doc) container = exports.getDocumentHead(doc);\n    container.insertBefore(style, container.firstChild);\n  }\n  exports.importCssString = importCssString;\n  exports.importCssStylsheet = function (uri, doc) {\n    exports.buildDom(\n      [\"link\", { rel: \"stylesheet\", href: uri }],\n      exports.getDocumentHead(doc),\n    );\n  };\n  exports.scrollbarWidth = function (doc) {\n    var inner = exports.createElement(\"ace_inner\");\n    inner.style.width = \"100%\";\n    inner.style.minWidth = \"0px\";\n    inner.style.height = \"200px\";\n    inner.style.display = \"block\";\n    var outer = exports.createElement(\"ace_outer\");\n    var style = outer.style;\n    style.position = \"absolute\";\n    style.left = \"-10000px\";\n    style.overflow = \"hidden\";\n    style.width = \"200px\";\n    style.minWidth = \"0px\";\n    style.height = \"150px\";\n    style.display = \"block\";\n    outer.appendChild(inner);\n    var body =\n      (doc && doc.documentElement) || (document && document.documentElement);\n    if (!body) return 0;\n    body.appendChild(outer);\n    var noScrollbar = inner.offsetWidth;\n    style.overflow = \"scroll\";\n    var withScrollbar = inner.offsetWidth;\n    if (noScrollbar === withScrollbar) {\n      withScrollbar = outer.clientWidth;\n    }\n    body.removeChild(outer);\n    return noScrollbar - withScrollbar;\n  };\n  exports.computedStyle = function (element, style) {\n    return window.getComputedStyle(element, \"\") || {};\n  };\n  exports.setStyle = function (styles, property, value) {\n    if (styles[property] !== value) {\n      styles[property] = value;\n    }\n  };\n  exports.HAS_CSS_ANIMATION = false;\n  exports.HAS_CSS_TRANSFORMS = false;\n  exports.HI_DPI = useragent.isWin\n    ? typeof window !== \"undefined\" && window.devicePixelRatio >= 1.5\n    : true;\n  if (useragent.isChromeOS) exports.HI_DPI = false;\n  if (typeof document !== \"undefined\") {\n    var div = document.createElement(\"div\");\n    if (exports.HI_DPI && div.style.transform !== undefined)\n      exports.HAS_CSS_TRANSFORMS = true;\n    if (!useragent.isEdge && typeof div.style.animationName !== \"undefined\")\n      exports.HAS_CSS_ANIMATION = true;\n    div = null;\n  }\n  if (exports.HAS_CSS_TRANSFORMS) {\n    exports.translate = function (element, tx, ty) {\n      element.style.transform =\n        \"translate(\" + Math.round(tx) + \"px, \" + Math.round(ty) + \"px)\";\n    };\n  } else {\n    exports.translate = function (element, tx, ty) {\n      element.style.top = Math.round(ty) + \"px\";\n      element.style.left = Math.round(tx) + \"px\";\n    };\n  }\n});\n\ndefine(\"ace/lib/net\", [\n  \"require\",\n  \"exports\",\n  \"module\",\n  \"ace/lib/dom\",\n], function (require, exports, module) {\n  /*\n   * based on code from:\n   *\n   * @license RequireJS text 0.25.0 Copyright (c) 2010-2011, The Dojo Foundation All Rights Reserved.\n   * Available via the MIT or new BSD license.\n   * see: http://github.com/jrburke/requirejs for details\n   */\n  \"use strict\";\n  var dom = require(\"./dom\");\n  exports.get = function (url, callback) {\n    var xhr = new XMLHttpRequest();\n    xhr.open(\"GET\", url, true);\n    xhr.onreadystatechange = function () {\n      if (xhr.readyState === 4) {\n        callback(xhr.responseText);\n      }\n    };\n    xhr.send(null);\n  };\n  exports.loadScript = function (path, callback) {\n    var head = dom.getDocumentHead();\n    var s = document.createElement(\"script\");\n    s.src = path;\n    head.appendChild(s);\n    s.onload = s.onreadystatechange = function (_, isAbort) {\n      if (\n        isAbort ||\n        !s.readyState ||\n        s.readyState == \"loaded\" ||\n        s.readyState == \"complete\"\n      ) {\n        s = s.onload = s.onreadystatechange = null;\n        if (!isAbort) callback();\n      }\n    };\n  };\n  exports.qualifyURL = function (url) {\n    var a = document.createElement(\"a\");\n    a.href = url;\n    return a.href;\n  };\n});\n\ndefine(\"ace/lib/oop\", [\"require\", \"exports\", \"module\"], function (\n  require,\n  exports,\n  module,\n) {\n  \"use strict\";\n  exports.inherits = function (ctor, superCtor) {\n    ctor.super_ = superCtor;\n    ctor.prototype = Object.create(superCtor.prototype, {\n      constructor: {\n        value: ctor,\n        enumerable: false,\n        writable: true,\n        configurable: true,\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  exports.implement = function (proto, mixin) {\n    exports.mixin(proto, mixin);\n  };\n});\n\ndefine(\"ace/lib/event_emitter\", [\"require\", \"exports\", \"module\"], function (\n  require,\n  exports,\n  module,\n) {\n  \"use strict\";\n  var EventEmitter = {};\n  var stopPropagation = function () {\n    this.propagationStopped = true;\n  };\n  var preventDefault = function () {\n    this.defaultPrevented = true;\n  };\n  EventEmitter._emit = EventEmitter._dispatchEvent = function (eventName, e) {\n    this._eventRegistry || (this._eventRegistry = {});\n    this._defaultHandlers || (this._defaultHandlers = {});\n    var listeners = this._eventRegistry[eventName] || [];\n    var defaultHandler = this._defaultHandlers[eventName];\n    if (!listeners.length && !defaultHandler) return;\n    if (typeof e != \"object\" || !e) e = {};\n    if (!e.type) e.type = eventName;\n    if (!e.stopPropagation) e.stopPropagation = stopPropagation;\n    if (!e.preventDefault) e.preventDefault = preventDefault;\n    listeners = listeners.slice();\n    for (var i = 0; i < listeners.length; i++) {\n      listeners[i](e, this);\n      if (e.propagationStopped) break;\n    }\n    if (defaultHandler && !e.defaultPrevented) return defaultHandler(e, this);\n  };\n  EventEmitter._signal = function (eventName, e) {\n    var listeners = (this._eventRegistry || {})[eventName];\n    if (!listeners) return;\n    listeners = listeners.slice();\n    for (var i = 0; i < listeners.length; i++) listeners[i](e, this);\n  };\n  EventEmitter.once = function (eventName, callback) {\n    var _self = this;\n    this.on(eventName, function newCallback() {\n      _self.off(eventName, newCallback);\n      callback.apply(null, arguments);\n    });\n    if (!callback) {\n      return new Promise(function (resolve) {\n        callback = resolve;\n      });\n    }\n  };\n  EventEmitter.setDefaultHandler = function (eventName, callback) {\n    var handlers = this._defaultHandlers;\n    if (!handlers) handlers = this._defaultHandlers = { _disabled_: {} };\n    if (handlers[eventName]) {\n      var old = handlers[eventName];\n      var disabled = handlers._disabled_[eventName];\n      if (!disabled) handlers._disabled_[eventName] = disabled = [];\n      disabled.push(old);\n      var i = disabled.indexOf(callback);\n      if (i != -1) disabled.splice(i, 1);\n    }\n    handlers[eventName] = callback;\n  };\n  EventEmitter.removeDefaultHandler = function (eventName, callback) {\n    var handlers = this._defaultHandlers;\n    if (!handlers) return;\n    var disabled = handlers._disabled_[eventName];\n    if (handlers[eventName] == callback) {\n      if (disabled) this.setDefaultHandler(eventName, disabled.pop());\n    } else if (disabled) {\n      var i = disabled.indexOf(callback);\n      if (i != -1) disabled.splice(i, 1);\n    }\n  };\n  EventEmitter.on = EventEmitter.addEventListener = function (\n    eventName,\n    callback,\n    capturing,\n  ) {\n    this._eventRegistry = this._eventRegistry || {};\n    var listeners = this._eventRegistry[eventName];\n    if (!listeners) listeners = this._eventRegistry[eventName] = [];\n    if (listeners.indexOf(callback) == -1)\n      listeners[capturing ? \"unshift\" : \"push\"](callback);\n    return callback;\n  };\n  EventEmitter.off =\n    EventEmitter.removeListener =\n    EventEmitter.removeEventListener =\n      function (eventName, callback) {\n        this._eventRegistry = this._eventRegistry || {};\n        var listeners = this._eventRegistry[eventName];\n        if (!listeners) return;\n        var index = listeners.indexOf(callback);\n        if (index !== -1) listeners.splice(index, 1);\n      };\n  EventEmitter.removeAllListeners = function (eventName) {\n    if (!eventName) this._eventRegistry = this._defaultHandlers = undefined;\n    if (this._eventRegistry) this._eventRegistry[eventName] = undefined;\n    if (this._defaultHandlers) this._defaultHandlers[eventName] = undefined;\n  };\n  exports.EventEmitter = EventEmitter;\n});\n\ndefine(\"ace/lib/report_error\", [\"require\", \"exports\", \"module\"], function (\n  require,\n  exports,\n  module,\n) {\n  exports.reportError = function reportError(msg, data) {\n    var e = new Error(msg);\n    e[\"data\"] = data;\n    if (typeof console == \"object\" && console.error) console.error(e);\n    setTimeout(function () {\n      throw e;\n    });\n  };\n});\n\ndefine(\"ace/lib/app_config\", [\n  \"require\",\n  \"exports\",\n  \"module\",\n  \"ace/lib/oop\",\n  \"ace/lib/event_emitter\",\n  \"ace/lib/report_error\",\n], function (require, exports, module) {\n  \"no use strict\";\n  var oop = require(\"./oop\");\n  var EventEmitter = require(\"./event_emitter\").EventEmitter;\n  var reportError = require(\"./report_error\").reportError;\n  var optionsProvider = {\n    setOptions: function (optList) {\n      Object.keys(optList).forEach(function (key) {\n        this.setOption(key, optList[key]);\n      }, this);\n    },\n    getOptions: function (optionNames) {\n      var result = {};\n      if (!optionNames) {\n        var options = this.$options;\n        optionNames = Object.keys(options).filter(function (key) {\n          return !options[key].hidden;\n        });\n      } else if (!Array.isArray(optionNames)) {\n        result = optionNames;\n        optionNames = Object.keys(result);\n      }\n      optionNames.forEach(function (key) {\n        result[key] = this.getOption(key);\n      }, this);\n      return result;\n    },\n    setOption: function (name, value) {\n      if (this[\"$\" + name] === value) return;\n      var opt = this.$options[name];\n      if (!opt) {\n        return warn('misspelled option \"' + name + '\"');\n      }\n      if (opt.forwardTo)\n        return (\n          this[opt.forwardTo] && this[opt.forwardTo].setOption(name, value)\n        );\n      if (!opt.handlesSet) this[\"$\" + name] = value;\n      if (opt && opt.set) opt.set.call(this, value);\n    },\n    getOption: function (name) {\n      var opt = this.$options[name];\n      if (!opt) {\n        return warn('misspelled option \"' + name + '\"');\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    },\n  };\n  function warn(message) {\n    if (typeof console != \"undefined\" && console.warn)\n      console.warn.apply(console, arguments);\n  }\n  var messages;\n  var AppConfig = /** @class */ (function () {\n    function AppConfig() {\n      this.$defaultOptions = {};\n    }\n    AppConfig.prototype.defineOptions = function (obj, path, options) {\n      if (!obj.$options) this.$defaultOptions[path] = obj.$options = {};\n      Object.keys(options).forEach(function (key) {\n        var opt = options[key];\n        if (typeof opt == \"string\") opt = { forwardTo: opt };\n        opt.name || (opt.name = key);\n        obj.$options[opt.name] = opt;\n        if (\"initialValue\" in opt) obj[\"$\" + opt.name] = opt.initialValue;\n      });\n      oop.implement(obj, optionsProvider);\n      return this;\n    };\n    AppConfig.prototype.resetOptions = function (obj) {\n      Object.keys(obj.$options).forEach(function (key) {\n        var opt = obj.$options[key];\n        if (\"value\" in opt) obj.setOption(key, opt.value);\n      });\n    };\n    AppConfig.prototype.setDefaultValue = function (path, name, value) {\n      if (!path) {\n        for (path in this.$defaultOptions)\n          if (this.$defaultOptions[path][name]) break;\n        if (!this.$defaultOptions[path][name]) return false;\n      }\n      var opts =\n        this.$defaultOptions[path] || (this.$defaultOptions[path] = {});\n      if (opts[name]) {\n        if (opts.forwardTo) this.setDefaultValue(opts.forwardTo, name, value);\n        else opts[name].value = value;\n      }\n    };\n    AppConfig.prototype.setDefaultValues = function (path, optionHash) {\n      Object.keys(optionHash).forEach(function (key) {\n        this.setDefaultValue(path, key, optionHash[key]);\n      }, this);\n    };\n    AppConfig.prototype.setMessages = function (value) {\n      messages = value;\n    };\n    AppConfig.prototype.nls = function (string, params) {\n      if (messages && !messages[string]) {\n        warn(\n          \"No message found for '\" +\n            string +\n            \"' in the provided messages, falling back to default English message.\",\n        );\n      }\n      var translated = (messages && messages[string]) || string;\n      if (params) {\n        translated = translated.replace(/\\$(\\$|[\\d]+)/g, function (_, name) {\n          if (name == \"$\") return \"$\";\n          return params[name];\n        });\n      }\n      return translated;\n    };\n    return AppConfig;\n  })();\n  AppConfig.prototype.warn = warn;\n  AppConfig.prototype.reportError = reportError;\n  oop.implement(AppConfig.prototype, EventEmitter);\n  exports.AppConfig = AppConfig;\n});\n\ndefine(\"ace/theme/textmate-css\", [\"require\", \"exports\", \"module\"], function (\n  require,\n  exports,\n  module,\n) {\n  module.exports =\n    '.ace-tm .ace_gutter {\\n  background: #f0f0f0;\\n  color: #333;\\n}\\n\\n.ace-tm .ace_print-margin {\\n  width: 1px;\\n  background: #e8e8e8;\\n}\\n\\n.ace-tm .ace_fold {\\n    background-color: #6B72E6;\\n}\\n\\n.ace-tm {\\n  background-color: #FFFFFF;\\n  color: black;\\n}\\n\\n.ace-tm .ace_cursor {\\n  color: black;\\n}\\n        \\n.ace-tm .ace_invisible {\\n  color: rgb(191, 191, 191);\\n}\\n\\n.ace-tm .ace_storage,\\n.ace-tm .ace_keyword {\\n  color: blue;\\n}\\n\\n.ace-tm .ace_constant {\\n  color: rgb(197, 6, 11);\\n}\\n\\n.ace-tm .ace_constant.ace_buildin {\\n  color: rgb(88, 72, 246);\\n}\\n\\n.ace-tm .ace_constant.ace_language {\\n  color: rgb(88, 92, 246);\\n}\\n\\n.ace-tm .ace_constant.ace_library {\\n  color: rgb(6, 150, 14);\\n}\\n\\n.ace-tm .ace_invalid {\\n  background-color: rgba(255, 0, 0, 0.1);\\n  color: red;\\n}\\n\\n.ace-tm .ace_support.ace_function {\\n  color: rgb(60, 76, 114);\\n}\\n\\n.ace-tm .ace_support.ace_constant {\\n  color: rgb(6, 150, 14);\\n}\\n\\n.ace-tm .ace_support.ace_type,\\n.ace-tm .ace_support.ace_class {\\n  color: rgb(109, 121, 222);\\n}\\n\\n.ace-tm .ace_keyword.ace_operator {\\n  color: rgb(104, 118, 135);\\n}\\n\\n.ace-tm .ace_string {\\n  color: rgb(3, 106, 7);\\n}\\n\\n.ace-tm .ace_comment {\\n  color: rgb(76, 136, 107);\\n}\\n\\n.ace-tm .ace_comment.ace_doc {\\n  color: rgb(0, 102, 255);\\n}\\n\\n.ace-tm .ace_comment.ace_doc.ace_tag {\\n  color: rgb(128, 159, 191);\\n}\\n\\n.ace-tm .ace_constant.ace_numeric {\\n  color: rgb(0, 0, 205);\\n}\\n\\n.ace-tm .ace_variable {\\n  color: rgb(49, 132, 149);\\n}\\n\\n.ace-tm .ace_xml-pe {\\n  color: rgb(104, 104, 91);\\n}\\n\\n.ace-tm .ace_entity.ace_name.ace_function {\\n  color: #0000A2;\\n}\\n\\n\\n.ace-tm .ace_heading {\\n  color: rgb(12, 7, 255);\\n}\\n\\n.ace-tm .ace_list {\\n  color:rgb(185, 6, 144);\\n}\\n\\n.ace-tm .ace_meta.ace_tag {\\n  color:rgb(0, 22, 142);\\n}\\n\\n.ace-tm .ace_string.ace_regex {\\n  color: rgb(255, 0, 0)\\n}\\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}\\n.ace-tm .ace_marker-layer .ace_step {\\n  background: rgb(252, 255, 0);\\n}\\n\\n.ace-tm .ace_marker-layer .ace_stack {\\n  background: rgb(164, 229, 101);\\n}\\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\\n.ace-tm .ace_marker-layer .ace_active-line {\\n  background: rgba(0, 0, 0, 0.07);\\n}\\n\\n.ace-tm .ace_gutter-active-line {\\n    background-color : #dcdcdc;\\n}\\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\\n.ace-tm .ace_indent-guide {\\n  background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAE0lEQVQImWP4////f4bLly//BwAmVgd1/w11/gAAAABJRU5ErkJggg==\") right repeat-y;\\n}\\n\\n.ace-tm .ace_indent-guide-active {\\n  background: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAIGNIUk0AAHolAACAgwAA+f8AAIDpAAB1MAAA6mAAADqYAAAXb5JfxUYAAAAZSURBVHjaYvj///9/hivKyv8BAAAA//8DACLqBhbvk+/eAAAAAElFTkSuQmCC\") right repeat-y;\\n}\\n';\n});\n\ndefine(\"ace/theme/textmate\", [\n  \"require\",\n  \"exports\",\n  \"module\",\n  \"ace/theme/textmate-css\",\n  \"ace/lib/dom\",\n], function (require, exports, module) {\n  \"use strict\";\n  exports.isDark = false;\n  exports.cssClass = \"ace-tm\";\n  exports.cssText = require(\"./textmate-css\");\n  exports.$id = \"ace/theme/textmate\";\n  var dom = require(\"../lib/dom\");\n  dom.importCssString(exports.cssText, exports.cssClass, false);\n});\n\ndefine(\"ace/config\", [\n  \"require\",\n  \"exports\",\n  \"module\",\n  \"ace/lib/lang\",\n  \"ace/lib/net\",\n  \"ace/lib/dom\",\n  \"ace/lib/app_config\",\n  \"ace/theme/textmate\",\n], function (require, exports, module) {\n  \"no use strict\";\n  var lang = require(\"./lib/lang\");\n  var net = require(\"./lib/net\");\n  var dom = require(\"./lib/dom\");\n  var AppConfig = require(\"./lib/app_config\").AppConfig;\n  module.exports = exports = new AppConfig();\n  var options = {\n    packaged: false,\n    workerPath: null,\n    modePath: null,\n    themePath: null,\n    basePath: \"\",\n    suffix: \".js\",\n    $moduleUrls: {},\n    loadWorkerFromBlob: true,\n    sharedPopups: false,\n    useStrictCSP: null,\n  };\n  exports.get = function (key) {\n    if (!options.hasOwnProperty(key))\n      throw new Error(\"Unknown config key: \" + key);\n    return options[key];\n  };\n  exports.set = function (key, value) {\n    if (options.hasOwnProperty(key)) options[key] = value;\n    else if (this.setDefaultValue(\"\", key, value) == false)\n      throw new Error(\"Unknown config key: \" + key);\n    if (key == \"useStrictCSP\") dom.useStrictCSP(value);\n  };\n  exports.all = function () {\n    return lang.copyObject(options);\n  };\n  exports.$modes = {};\n  exports.moduleUrl = function (name, component) {\n    if (options.$moduleUrls[name]) return options.$moduleUrls[name];\n    var parts = name.split(\"/\");\n    component = component || parts[parts.length - 2] || \"\";\n    var sep = component == \"snippets\" ? \"/\" : \"-\";\n    var base = parts[parts.length - 1];\n    if (component == \"worker\" && sep == \"-\") {\n      var re = new RegExp(\n        \"^\" + component + \"[\\\\-_]|[\\\\-_]\" + component + \"$\",\n        \"g\",\n      );\n      base = base.replace(re, \"\");\n    }\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      path = options.basePath;\n    } else if (sep == \"/\") {\n      component = sep = \"\";\n    }\n    if (path && path.slice(-1) != \"/\") path += \"/\";\n    return path + component + sep + base + this.get(\"suffix\");\n  };\n  exports.setModuleUrl = function (name, subst) {\n    return (options.$moduleUrls[name] = subst);\n  };\n  var loader = function (moduleName, cb) {\n    if (\n      moduleName === \"ace/theme/textmate\" ||\n      moduleName === \"./theme/textmate\"\n    )\n      return cb(null, require(\"./theme/textmate\"));\n    if (customLoader) return customLoader(moduleName, cb);\n    console.error(\"loader is not configured\");\n  };\n  var customLoader;\n  exports.setLoader = function (cb) {\n    customLoader = cb;\n  };\n  exports.dynamicModules = Object.create(null);\n  exports.$loading = {};\n  exports.$loaded = {};\n  exports.loadModule = function (moduleId, onLoad) {\n    var loadedModule;\n    if (Array.isArray(moduleId)) {\n      var moduleType = moduleId[0];\n      var moduleName = moduleId[1];\n    } else if (typeof moduleId == \"string\") {\n      var moduleName = moduleId;\n    }\n    var load = function (module) {\n      if (module && !exports.$loading[moduleName])\n        return onLoad && onLoad(module);\n      if (!exports.$loading[moduleName]) exports.$loading[moduleName] = [];\n      exports.$loading[moduleName].push(onLoad);\n      if (exports.$loading[moduleName].length > 1) return;\n      var afterLoad = function () {\n        loader(moduleName, function (err, module) {\n          if (module) exports.$loaded[moduleName] = module;\n          exports._emit(\"load.module\", { name: moduleName, module: module });\n          var listeners = exports.$loading[moduleName];\n          exports.$loading[moduleName] = null;\n          listeners.forEach(function (onLoad) {\n            onLoad && onLoad(module);\n          });\n        });\n      };\n      if (!exports.get(\"packaged\")) return afterLoad();\n      net.loadScript(exports.moduleUrl(moduleName, moduleType), afterLoad);\n      reportErrorIfPathIsNotConfigured();\n    };\n    if (exports.dynamicModules[moduleName]) {\n      exports.dynamicModules[moduleName]().then(function (module) {\n        if (module.default) {\n          load(module.default);\n        } else {\n          load(module);\n        }\n      });\n    } else {\n      try {\n        loadedModule = this.$require(moduleName);\n      } catch (e) {}\n      load(loadedModule || exports.$loaded[moduleName]);\n    }\n  };\n  exports.$require = function (moduleName) {\n    if (typeof module[\"require\"] == \"function\") {\n      var req = \"require\";\n      return module[req](moduleName);\n    }\n  };\n  exports.setModuleLoader = function (moduleName, onLoad) {\n    exports.dynamicModules[moduleName] = onLoad;\n  };\n  var reportErrorIfPathIsNotConfigured = function () {\n    if (\n      !options.basePath &&\n      !options.workerPath &&\n      !options.modePath &&\n      !options.themePath &&\n      !Object.keys(options.$moduleUrls).length\n    ) {\n      console.error(\n        \"Unable to infer path to ace from script src,\",\n        \"use ace.config.set('basePath', 'path') to enable dynamic loading of modes and themes\",\n        \"or with webpack use ace/webpack-resolver\",\n      );\n      reportErrorIfPathIsNotConfigured = function () {};\n    }\n  };\n  exports.version = \"1.32.3\";\n});\n\ndefine(\"ace/loader_build\", [\n  \"require\",\n  \"exports\",\n  \"module\",\n  \"ace/lib/fixoldbrowsers\",\n  \"ace/config\",\n], function (require, exports, module) {\n  \"use strict\";\n\n  require(\"./lib/fixoldbrowsers\");\n  var config = require(\"./config\");\n  config.setLoader(function (moduleName, cb) {\n    require([moduleName], function (module) {\n      cb(null, module);\n    });\n  });\n\n  var global = (function () {\n    return this || (typeof window != \"undefined\" && window);\n  })();\n\n  module.exports = function (ace) {\n    config.init = init;\n    config.$require = require;\n    ace.require = require;\n\n    if (typeof define === \"function\") ace.define = define;\n  };\n  init(true);\n  function init(packaged) {\n    if (!global || !global.document) return;\n\n    config.set(\n      \"packaged\",\n      packaged ||\n        require.packaged ||\n        module.packaged ||\n        (global.define && define.packaged),\n    );\n\n    var scriptOptions = {};\n    var scriptUrl = \"\";\n    var currentScript = document.currentScript || document._currentScript; // native or polyfill\n    var currentDocument =\n      (currentScript && currentScript.ownerDocument) || document;\n\n    if (currentScript && currentScript.src) {\n      scriptUrl =\n        currentScript.src.split(/[?#]/)[0].split(\"/\").slice(0, -1).join(\"/\") ||\n        \"\";\n    }\n\n    var scripts = currentDocument.getElementsByTagName(\"script\");\n    for (var i = 0; i < scripts.length; i++) {\n      var script = scripts[i];\n\n      var src = script.src || script.getAttribute(\"src\");\n      if (!src) continue;\n\n      var attributes = script.attributes;\n      for (var j = 0, l = attributes.length; j < l; j++) {\n        var attr = attributes[j];\n        if (attr.name.indexOf(\"data-ace-\") === 0) {\n          scriptOptions[deHyphenate(attr.name.replace(/^data-ace-/, \"\"))] =\n            attr.value;\n        }\n      }\n\n      var m = src.match(/^(.*)\\/ace([\\-.]\\w+)?\\.js(\\?|$)/);\n      if (m) scriptUrl = m[1];\n    }\n\n    if (scriptUrl) {\n      scriptOptions.base = scriptOptions.base || scriptUrl;\n      scriptOptions.packaged = true;\n    }\n\n    scriptOptions.basePath = scriptOptions.base;\n    scriptOptions.workerPath = scriptOptions.workerPath || scriptOptions.base;\n    scriptOptions.modePath = scriptOptions.modePath || scriptOptions.base;\n    scriptOptions.themePath = scriptOptions.themePath || scriptOptions.base;\n    delete scriptOptions.base;\n\n    for (var key in scriptOptions)\n      if (typeof scriptOptions[key] !== \"undefined\")\n        config.set(key, scriptOptions[key]);\n  }\n\n  function deHyphenate(str) {\n    return str.replace(/-(.)/g, function (m, m1) {\n      return m1.toUpperCase();\n    });\n  }\n});\n\ndefine(\"ace/range\", [\"require\", \"exports\", \"module\"], function (\n  require,\n  exports,\n  module,\n) {\n  \"use strict\";\n  var Range = /** @class */ (function () {\n    function Range(startRow, startColumn, endRow, endColumn) {\n      this.start = {\n        row: startRow,\n        column: startColumn,\n      };\n      this.end = {\n        row: endRow,\n        column: endColumn,\n      };\n    }\n    Range.prototype.isEqual = function (range) {\n      return (\n        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    };\n    Range.prototype.toString = function () {\n      return (\n        \"Range: [\" +\n        this.start.row +\n        \"/\" +\n        this.start.column +\n        \"] -> [\" +\n        this.end.row +\n        \"/\" +\n        this.end.column +\n        \"]\"\n      );\n    };\n    Range.prototype.contains = function (row, column) {\n      return this.compare(row, column) == 0;\n    };\n    Range.prototype.compareRange = function (range) {\n      var cmp,\n        end = range.end,\n        start = range.start;\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        } else if (cmp == 0) {\n          return 1;\n        } else {\n          return 0;\n        }\n      } else if (cmp == -1) {\n        return -2;\n      } else {\n        cmp = this.compare(start.row, start.column);\n        if (cmp == -1) {\n          return -1;\n        } else if (cmp == 1) {\n          return 42;\n        } else {\n          return 0;\n        }\n      }\n    };\n    Range.prototype.comparePoint = function (p) {\n      return this.compare(p.row, p.column);\n    };\n    Range.prototype.containsRange = function (range) {\n      return (\n        this.comparePoint(range.start) == 0 && this.comparePoint(range.end) == 0\n      );\n    };\n    Range.prototype.intersects = function (range) {\n      var cmp = this.compareRange(range);\n      return cmp == -1 || cmp == 0 || cmp == 1;\n    };\n    Range.prototype.isEnd = function (row, column) {\n      return this.end.row == row && this.end.column == column;\n    };\n    Range.prototype.isStart = function (row, column) {\n      return this.start.row == row && this.start.column == column;\n    };\n    Range.prototype.setStart = function (row, column) {\n      if (typeof row == \"object\") {\n        this.start.column = row.column;\n        this.start.row = row.row;\n      } else {\n        this.start.row = row;\n        this.start.column = column;\n      }\n    };\n    Range.prototype.setEnd = function (row, column) {\n      if (typeof row == \"object\") {\n        this.end.column = row.column;\n        this.end.row = row.row;\n      } else {\n        this.end.row = row;\n        this.end.column = column;\n      }\n    };\n    Range.prototype.inside = function (row, column) {\n      if (this.compare(row, column) == 0) {\n        if (this.isEnd(row, column) || this.isStart(row, column)) {\n          return false;\n        } else {\n          return true;\n        }\n      }\n      return false;\n    };\n    Range.prototype.insideStart = function (row, column) {\n      if (this.compare(row, column) == 0) {\n        if (this.isEnd(row, column)) {\n          return false;\n        } else {\n          return true;\n        }\n      }\n      return false;\n    };\n    Range.prototype.insideEnd = function (row, column) {\n      if (this.compare(row, column) == 0) {\n        if (this.isStart(row, column)) {\n          return false;\n        } else {\n          return true;\n        }\n      }\n      return false;\n    };\n    Range.prototype.compare = function (row, column) {\n      if (!this.isMultiLine()) {\n        if (row === this.start.row) {\n          return column < this.start.column\n            ? -1\n            : column > this.end.column\n              ? 1\n              : 0;\n        }\n      }\n      if (row < this.start.row) return -1;\n      if (row > this.end.row) return 1;\n      if (this.start.row === row) return column >= this.start.column ? 0 : -1;\n      if (this.end.row === row) return column <= this.end.column ? 0 : 1;\n      return 0;\n    };\n    Range.prototype.compareStart = function (row, column) {\n      if (this.start.row == row && this.start.column == column) {\n        return -1;\n      } else {\n        return this.compare(row, column);\n      }\n    };\n    Range.prototype.compareEnd = function (row, column) {\n      if (this.end.row == row && this.end.column == column) {\n        return 1;\n      } else {\n        return this.compare(row, column);\n      }\n    };\n    Range.prototype.compareInside = function (row, column) {\n      if (this.end.row == row && this.end.column == column) {\n        return 1;\n      } else if (this.start.row == row && this.start.column == column) {\n        return -1;\n      } else {\n        return this.compare(row, column);\n      }\n    };\n    Range.prototype.clipRows = function (firstRow, lastRow) {\n      if (this.end.row > lastRow) var end = { row: lastRow + 1, column: 0 };\n      else if (this.end.row < firstRow) var end = { row: firstRow, column: 0 };\n      if (this.start.row > lastRow) var start = { row: lastRow + 1, column: 0 };\n      else if (this.start.row < firstRow)\n        var start = { row: firstRow, column: 0 };\n      return Range.fromPoints(start || this.start, end || this.end);\n    };\n    Range.prototype.extend = function (row, column) {\n      var cmp = this.compare(row, column);\n      if (cmp == 0) return this;\n      else if (cmp == -1) var start = { row: row, column: column };\n      else var end = { row: row, column: column };\n      return Range.fromPoints(start || this.start, end || this.end);\n    };\n    Range.prototype.isEmpty = function () {\n      return (\n        this.start.row === this.end.row && this.start.column === this.end.column\n      );\n    };\n    Range.prototype.isMultiLine = function () {\n      return this.start.row !== this.end.row;\n    };\n    Range.prototype.clone = function () {\n      return Range.fromPoints(this.start, this.end);\n    };\n    Range.prototype.collapseRows = function () {\n      if (this.end.column == 0)\n        return new Range(\n          this.start.row,\n          0,\n          Math.max(this.start.row, this.end.row - 1),\n          0,\n        );\n      else return new Range(this.start.row, 0, this.end.row, 0);\n    };\n    Range.prototype.toScreenRange = function (session) {\n      var screenPosStart = session.documentToScreenPosition(this.start);\n      var screenPosEnd = session.documentToScreenPosition(this.end);\n      return new Range(\n        screenPosStart.row,\n        screenPosStart.column,\n        screenPosEnd.row,\n        screenPosEnd.column,\n      );\n    };\n    Range.prototype.moveBy = function (row, column) {\n      this.start.row += row;\n      this.start.column += column;\n      this.end.row += row;\n      this.end.column += column;\n    };\n    return Range;\n  })();\n  Range.fromPoints = function (start, end) {\n    return new Range(start.row, start.column, end.row, end.column);\n  };\n  Range.comparePoints = function (p1, p2) {\n    return p1.row - p2.row || p1.column - p2.column;\n  };\n  exports.Range = Range;\n});\n\ndefine(\"ace/lib/keys\", [\n  \"require\",\n  \"exports\",\n  \"module\",\n  \"ace/lib/oop\",\n], function (require, exports, module) {\n  /*! @license\n    ==========================================================================\n    SproutCore -- JavaScript Application Framework\n    copyright 2006-2009, Sprout Systems Inc., Apple Inc. and contributors.\n    \n    Permission is hereby granted, free of charge, to any person obtaining a\n    copy of this software and associated documentation files (the \"Software\"),\n    to deal in the Software without restriction, including without limitation\n    the rights to use, copy, modify, merge, publish, distribute, sublicense,\n    and/or sell copies of the Software, and to permit persons to whom the\n    Software is furnished to do so, subject to the following conditions:\n    \n    The above copyright notice and this permission notice shall be included in\n    all copies or substantial portions of the Software.\n    \n    THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n    IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n    FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n    AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n    LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n    FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER\n    DEALINGS IN THE SOFTWARE.\n    \n    SproutCore and the SproutCore logo are trademarks of Sprout Systems, Inc.\n    \n    For more information about SproutCore, visit http://www.sproutcore.com\n    \n    \n    ==========================================================================\n    @license */\n  \"use strict\";\n  var oop = require(\"./oop\");\n  var Keys = (function () {\n    var ret = {\n      MODIFIER_KEYS: {\n        16: \"Shift\",\n        17: \"Ctrl\",\n        18: \"Alt\",\n        224: \"Meta\",\n        91: \"MetaLeft\",\n        92: \"MetaRight\",\n        93: \"ContextMenu\",\n      },\n      KEY_MODS: {\n        ctrl: 1,\n        alt: 2,\n        option: 2,\n        shift: 4,\n        super: 8,\n        meta: 8,\n        command: 8,\n        cmd: 8,\n        control: 1,\n      },\n      FUNCTION_KEYS: {\n        8: \"Backspace\",\n        9: \"Tab\",\n        13: \"Return\",\n        19: \"Pause\",\n        27: \"Esc\",\n        32: \"Space\",\n        33: \"PageUp\",\n        34: \"PageDown\",\n        35: \"End\",\n        36: \"Home\",\n        37: \"Left\",\n        38: \"Up\",\n        39: \"Right\",\n        40: \"Down\",\n        44: \"Print\",\n        45: \"Insert\",\n        46: \"Delete\",\n        96: \"Numpad0\",\n        97: \"Numpad1\",\n        98: \"Numpad2\",\n        99: \"Numpad3\",\n        100: \"Numpad4\",\n        101: \"Numpad5\",\n        102: \"Numpad6\",\n        103: \"Numpad7\",\n        104: \"Numpad8\",\n        105: \"Numpad9\",\n        \"-13\": \"NumpadEnter\",\n        112: \"F1\",\n        113: \"F2\",\n        114: \"F3\",\n        115: \"F4\",\n        116: \"F5\",\n        117: \"F6\",\n        118: \"F7\",\n        119: \"F8\",\n        120: \"F9\",\n        121: \"F10\",\n        122: \"F11\",\n        123: \"F12\",\n        144: \"Numlock\",\n        145: \"Scrolllock\",\n      },\n      PRINTABLE_KEYS: {\n        32: \" \",\n        48: \"0\",\n        49: \"1\",\n        50: \"2\",\n        51: \"3\",\n        52: \"4\",\n        53: \"5\",\n        54: \"6\",\n        55: \"7\",\n        56: \"8\",\n        57: \"9\",\n        59: \";\",\n        61: \"=\",\n        65: \"a\",\n        66: \"b\",\n        67: \"c\",\n        68: \"d\",\n        69: \"e\",\n        70: \"f\",\n        71: \"g\",\n        72: \"h\",\n        73: \"i\",\n        74: \"j\",\n        75: \"k\",\n        76: \"l\",\n        77: \"m\",\n        78: \"n\",\n        79: \"o\",\n        80: \"p\",\n        81: \"q\",\n        82: \"r\",\n        83: \"s\",\n        84: \"t\",\n        85: \"u\",\n        86: \"v\",\n        87: \"w\",\n        88: \"x\",\n        89: \"y\",\n        90: \"z\",\n        107: \"+\",\n        109: \"-\",\n        110: \".\",\n        186: \";\",\n        187: \"=\",\n        188: \",\",\n        189: \"-\",\n        190: \".\",\n        191: \"/\",\n        192: \"`\",\n        219: \"[\",\n        220: \"\\\\\",\n        221: \"]\",\n        222: \"'\",\n        111: \"/\",\n        106: \"*\",\n      },\n    };\n    ret.PRINTABLE_KEYS[173] = \"-\";\n    var name, i;\n    for (i in ret.FUNCTION_KEYS) {\n      name = ret.FUNCTION_KEYS[i].toLowerCase();\n      ret[name] = parseInt(i, 10);\n    }\n    for (i in ret.PRINTABLE_KEYS) {\n      name = ret.PRINTABLE_KEYS[i].toLowerCase();\n      ret[name] = parseInt(i, 10);\n    }\n    oop.mixin(ret, ret.MODIFIER_KEYS);\n    oop.mixin(ret, ret.PRINTABLE_KEYS);\n    oop.mixin(ret, ret.FUNCTION_KEYS);\n    ret.enter = ret[\"return\"];\n    ret.escape = ret.esc;\n    ret.del = ret[\"delete\"];\n    (function () {\n      var mods = [\"cmd\", \"ctrl\", \"alt\", \"shift\"];\n      for (var i = Math.pow(2, mods.length); i--; ) {\n        ret.KEY_MODS[i] =\n          mods\n            .filter(function (x) {\n              return i & ret.KEY_MODS[x];\n            })\n            .join(\"-\") + \"-\";\n      }\n    })();\n    ret.KEY_MODS[0] = \"\";\n    ret.KEY_MODS[-1] = \"input-\";\n    return ret;\n  })();\n  oop.mixin(exports, Keys);\n  exports.default = exports;\n  exports.keyCodeToString = function (keyCode) {\n    var keyString = Keys[keyCode];\n    if (typeof keyString != \"string\") keyString = String.fromCharCode(keyCode);\n    return keyString.toLowerCase();\n  };\n});\n\ndefine(\"ace/lib/event\", [\n  \"require\",\n  \"exports\",\n  \"module\",\n  \"ace/lib/keys\",\n  \"ace/lib/useragent\",\n], function (require, exports, module) {\n  \"use strict\";\n  var keys = require(\"./keys\");\n  var useragent = require(\"./useragent\");\n  var pressedKeys = null;\n  var ts = 0;\n  var activeListenerOptions;\n  function detectListenerOptionsSupport() {\n    activeListenerOptions = false;\n    try {\n      document.createComment(\"\").addEventListener(\"test\", function () {}, {\n        get passive() {\n          activeListenerOptions = { passive: false };\n          return true;\n        },\n      });\n    } catch (e) {}\n  }\n  function getListenerOptions() {\n    if (activeListenerOptions == undefined) detectListenerOptionsSupport();\n    return activeListenerOptions;\n  }\n  function EventListener(elem, type, callback) {\n    this.elem = elem;\n    this.type = type;\n    this.callback = callback;\n  }\n  EventListener.prototype.destroy = function () {\n    removeListener(this.elem, this.type, this.callback);\n    this.elem = this.type = this.callback = undefined;\n  };\n  var addListener = (exports.addListener = function (\n    elem,\n    type,\n    callback,\n    /**@type{any?}*/ destroyer,\n  ) {\n    elem.addEventListener(type, callback, getListenerOptions());\n    if (destroyer)\n      destroyer.$toDestroy.push(new EventListener(elem, type, callback));\n  });\n  var removeListener = (exports.removeListener = function (\n    elem,\n    type,\n    callback,\n  ) {\n    elem.removeEventListener(type, callback, getListenerOptions());\n  });\n  exports.stopEvent = function (e) {\n    exports.stopPropagation(e);\n    exports.preventDefault(e);\n    return false;\n  };\n  exports.stopPropagation = function (e) {\n    if (e.stopPropagation) e.stopPropagation();\n  };\n  exports.preventDefault = function (e) {\n    if (e.preventDefault) e.preventDefault();\n  };\n  exports.getButton = function (e) {\n    if (e.type == \"dblclick\") return 0;\n    if (\n      e.type == \"contextmenu\" ||\n      (useragent.isMac && e.ctrlKey && !e.altKey && !e.shiftKey)\n    )\n      return 2;\n    return e.button;\n  };\n  exports.capture = function (el, eventHandler, releaseCaptureHandler) {\n    var ownerDocument = (el && el.ownerDocument) || document;\n    function onMouseUp(e) {\n      eventHandler && eventHandler(e);\n      releaseCaptureHandler && releaseCaptureHandler(e);\n      removeListener(ownerDocument, \"mousemove\", eventHandler);\n      removeListener(ownerDocument, \"mouseup\", onMouseUp);\n      removeListener(ownerDocument, \"dragstart\", onMouseUp);\n    }\n    addListener(ownerDocument, \"mousemove\", eventHandler);\n    addListener(ownerDocument, \"mouseup\", onMouseUp);\n    addListener(ownerDocument, \"dragstart\", onMouseUp);\n    return onMouseUp;\n  };\n  exports.addMouseWheelListener = function (el, callback, destroyer) {\n    addListener(\n      el,\n      \"wheel\",\n      function (e) {\n        var factor = 0.15;\n        var deltaX = e.deltaX || 0;\n        var deltaY = e.deltaY || 0;\n        switch (e.deltaMode) {\n          case e.DOM_DELTA_PIXEL:\n            e.wheelX = deltaX * factor;\n            e.wheelY = deltaY * factor;\n            break;\n          case e.DOM_DELTA_LINE:\n            var linePixels = 15;\n            e.wheelX = deltaX * linePixels;\n            e.wheelY = deltaY * linePixels;\n            break;\n          case e.DOM_DELTA_PAGE:\n            var pagePixels = 150;\n            e.wheelX = deltaX * pagePixels;\n            e.wheelY = deltaY * pagePixels;\n            break;\n        }\n        callback(e);\n      },\n      destroyer,\n    );\n  };\n  exports.addMultiMouseDownListener = function (\n    elements,\n    timeouts,\n    eventHandler,\n    callbackName,\n    destroyer,\n  ) {\n    var clicks = 0;\n    var startX, startY, timer;\n    var eventNames = {\n      2: \"dblclick\",\n      3: \"tripleclick\",\n      4: \"quadclick\",\n    };\n    function onMousedown(e) {\n      if (exports.getButton(e) !== 0) {\n        clicks = 0;\n      } else if (e.detail > 1) {\n        clicks++;\n        if (clicks > 4) clicks = 1;\n      } else {\n        clicks = 1;\n      }\n      if (useragent.isIE) {\n        var isNewClick =\n          Math.abs(e.clientX - startX) > 5 || Math.abs(e.clientY - startY) > 5;\n        if (!timer || isNewClick) clicks = 1;\n        if (timer) clearTimeout(timer);\n        timer = setTimeout(\n          function () {\n            timer = null;\n          },\n          timeouts[clicks - 1] || 600,\n        );\n        if (clicks == 1) {\n          startX = e.clientX;\n          startY = e.clientY;\n        }\n      }\n      e._clicks = clicks;\n      eventHandler[callbackName](\"mousedown\", e);\n      if (clicks > 4) clicks = 0;\n      else if (clicks > 1)\n        return eventHandler[callbackName](eventNames[clicks], e);\n    }\n    if (!Array.isArray(elements)) elements = [elements];\n    elements.forEach(function (el) {\n      addListener(el, \"mousedown\", onMousedown, destroyer);\n    });\n  };\n  var getModifierHash = function (e) {\n    return (\n      0 |\n      (e.ctrlKey ? 1 : 0) |\n      (e.altKey ? 2 : 0) |\n      (e.shiftKey ? 4 : 0) |\n      (e.metaKey ? 8 : 0)\n    );\n  };\n  exports.getModifierString = function (e) {\n    return keys.KEY_MODS[getModifierHash(e)];\n  };\n  function normalizeCommandKeys(callback, e, keyCode) {\n    var hashId = getModifierHash(e);\n    if (!useragent.isMac && pressedKeys) {\n      if (\n        e.getModifierState &&\n        (e.getModifierState(\"OS\") || e.getModifierState(\"Win\"))\n      )\n        hashId |= 8;\n      if (pressedKeys.altGr) {\n        if ((3 & hashId) != 3) pressedKeys.altGr = 0;\n        else return;\n      }\n      if (keyCode === 18 || keyCode === 17) {\n        var location = \"location\" in e ? e.location : e.keyLocation;\n        if (keyCode === 17 && location === 1) {\n          if (pressedKeys[keyCode] == 1) ts = e.timeStamp;\n        } else if (keyCode === 18 && hashId === 3 && location === 2) {\n          var dt = e.timeStamp - ts;\n          if (dt < 50) pressedKeys.altGr = true;\n        }\n      }\n    }\n    if (keyCode in keys.MODIFIER_KEYS) {\n      keyCode = -1;\n    }\n    if (!hashId && keyCode === 13) {\n      var location = \"location\" in e ? e.location : e.keyLocation;\n      if (location === 3) {\n        callback(e, hashId, -keyCode);\n        if (e.defaultPrevented) return;\n      }\n    }\n    if (useragent.isChromeOS && hashId & 8) {\n      callback(e, hashId, keyCode);\n      if (e.defaultPrevented) return;\n      else hashId &= ~8;\n    }\n    if (\n      !hashId &&\n      !(keyCode in keys.FUNCTION_KEYS) &&\n      !(keyCode in keys.PRINTABLE_KEYS)\n    ) {\n      return false;\n    }\n    return callback(e, hashId, keyCode);\n  }\n  exports.addCommandKeyListener = function (el, callback, destroyer) {\n    var lastDefaultPrevented = null;\n    addListener(\n      el,\n      \"keydown\",\n      function (e) {\n        pressedKeys[e.keyCode] = (pressedKeys[e.keyCode] || 0) + 1;\n        var result = normalizeCommandKeys(callback, e, e.keyCode);\n        lastDefaultPrevented = e.defaultPrevented;\n        return result;\n      },\n      destroyer,\n    );\n    addListener(\n      el,\n      \"keypress\",\n      function (e) {\n        if (\n          lastDefaultPrevented &&\n          (e.ctrlKey || e.altKey || e.shiftKey || e.metaKey)\n        ) {\n          exports.stopEvent(e);\n          lastDefaultPrevented = null;\n        }\n      },\n      destroyer,\n    );\n    addListener(\n      el,\n      \"keyup\",\n      function (e) {\n        pressedKeys[e.keyCode] = null;\n      },\n      destroyer,\n    );\n    if (!pressedKeys) {\n      resetPressedKeys();\n      addListener(window, \"focus\", resetPressedKeys);\n    }\n  };\n  function resetPressedKeys() {\n    pressedKeys = Object.create(null);\n  }\n  if (typeof window == \"object\" && window.postMessage && !useragent.isOldIE) {\n    var postMessageId = 1;\n    exports.nextTick = function (callback, win) {\n      win = win || window;\n      var messageName = \"zero-timeout-message-\" + postMessageId++;\n      var listener = function (e) {\n        if (e.data == messageName) {\n          exports.stopPropagation(e);\n          removeListener(win, \"message\", listener);\n          callback();\n        }\n      };\n      addListener(win, \"message\", listener);\n      win.postMessage(messageName, \"*\");\n    };\n  }\n  exports.$idleBlocked = false;\n  exports.onIdle = function (cb, timeout) {\n    return setTimeout(function handler() {\n      if (!exports.$idleBlocked) {\n        cb();\n      } else {\n        setTimeout(handler, 100);\n      }\n    }, timeout);\n  };\n  exports.$idleBlockId = null;\n  exports.blockIdle = function (delay) {\n    if (exports.$idleBlockId) clearTimeout(exports.$idleBlockId);\n    exports.$idleBlocked = true;\n    exports.$idleBlockId = setTimeout(function () {\n      exports.$idleBlocked = false;\n    }, delay || 100);\n  };\n  exports.nextFrame =\n    typeof window == \"object\" &&\n    (window.requestAnimationFrame ||\n      window[\"mozRequestAnimationFrame\"] ||\n      window[\"webkitRequestAnimationFrame\"] ||\n      window[\"msRequestAnimationFrame\"] ||\n      window[\"oRequestAnimationFrame\"]);\n  if (exports.nextFrame) exports.nextFrame = exports.nextFrame.bind(window);\n  else\n    exports.nextFrame = function (callback) {\n      setTimeout(callback, 17);\n    };\n});\n\ndefine(\"ace/clipboard\", [\"require\", \"exports\", \"module\"], function (\n  require,\n  exports,\n  module,\n) {\n  \"use strict\";\n  var $cancelT;\n  module.exports = {\n    lineMode: false,\n    pasteCancelled: function () {\n      if ($cancelT && $cancelT > Date.now() - 50) return true;\n      return ($cancelT = false);\n    },\n    cancel: function () {\n      $cancelT = Date.now();\n    },\n  };\n});\n\ndefine(\"ace/keyboard/textinput\", [\n  \"require\",\n  \"exports\",\n  \"module\",\n  \"ace/lib/event\",\n  \"ace/config\",\n  \"ace/lib/useragent\",\n  \"ace/lib/dom\",\n  \"ace/lib/lang\",\n  \"ace/clipboard\",\n  \"ace/lib/keys\",\n], function (require, exports, module) {\n  \"use strict\";\n  var event = require(\"../lib/event\");\n  var nls = require(\"../config\").nls;\n  var useragent = require(\"../lib/useragent\");\n  var dom = require(\"../lib/dom\");\n  var lang = require(\"../lib/lang\");\n  var clipboard = require(\"../clipboard\");\n  var BROKEN_SETDATA = useragent.isChrome < 18;\n  var USE_IE_MIME_TYPE = useragent.isIE;\n  var HAS_FOCUS_ARGS = useragent.isChrome > 63;\n  var MAX_LINE_LENGTH = 400;\n  var KEYS = require(\"../lib/keys\");\n  var MODS = KEYS.KEY_MODS;\n  var isIOS = useragent.isIOS;\n  var valueResetRegex = isIOS ? /\\s/ : /\\n/;\n  var isMobile = useragent.isMobile;\n  var TextInput;\n  TextInput = function (parentNode, host) {\n    var text = dom.createElement(\"textarea\");\n    text.className = \"ace_text-input\";\n    text.setAttribute(\"wrap\", \"off\");\n    text.setAttribute(\"autocorrect\", \"off\");\n    text.setAttribute(\"autocapitalize\", \"off\");\n    text.setAttribute(\"spellcheck\", \"false\");\n    text.style.opacity = \"0\";\n    parentNode.insertBefore(text, parentNode.firstChild);\n    var copied = false;\n    var pasted = false;\n    var inComposition = false;\n    var sendingText = false;\n    var tempStyle = \"\";\n    if (!isMobile) text.style.fontSize = \"1px\";\n    var commandMode = false;\n    var ignoreFocusEvents = false;\n    var lastValue = \"\";\n    var lastSelectionStart = 0;\n    var lastSelectionEnd = 0;\n    var lastRestoreEnd = 0;\n    var rowStart = Number.MAX_SAFE_INTEGER;\n    var rowEnd = Number.MIN_SAFE_INTEGER;\n    var numberOfExtraLines = 0;\n    try {\n      var isFocused = document.activeElement === text;\n    } catch (e) {}\n    this.setNumberOfExtraLines = function (number) {\n      rowStart = Number.MAX_SAFE_INTEGER;\n      rowEnd = Number.MIN_SAFE_INTEGER;\n      if (number < 0) {\n        numberOfExtraLines = 0;\n        return;\n      }\n      numberOfExtraLines = number;\n    };\n    this.setAriaOptions = function (options) {\n      if (options.activeDescendant) {\n        text.setAttribute(\"aria-haspopup\", \"true\");\n        text.setAttribute(\n          \"aria-autocomplete\",\n          options.inline ? \"both\" : \"list\",\n        );\n        text.setAttribute(\"aria-activedescendant\", options.activeDescendant);\n      } else {\n        text.setAttribute(\"aria-haspopup\", \"false\");\n        text.setAttribute(\"aria-autocomplete\", \"both\");\n        text.removeAttribute(\"aria-activedescendant\");\n      }\n      if (options.role) {\n        text.setAttribute(\"role\", options.role);\n      }\n      if (options.setLabel) {\n        text.setAttribute(\"aria-roledescription\", nls(\"editor\"));\n        if (host.session) {\n          var row = host.session.selection.cursor.row;\n          text.setAttribute(\"aria-label\", nls(\"Cursor at row $0\", [row + 1]));\n        }\n      }\n    };\n    this.setAriaOptions({ role: \"textbox\" });\n    event.addListener(\n      text,\n      \"blur\",\n      function (e) {\n        if (ignoreFocusEvents) return;\n        host.onBlur(e);\n        isFocused = false;\n      },\n      host,\n    );\n    event.addListener(\n      text,\n      \"focus\",\n      function (e) {\n        if (ignoreFocusEvents) return;\n        isFocused = true;\n        if (useragent.isEdge) {\n          try {\n            if (!document.hasFocus()) return;\n          } catch (e) {}\n        }\n        host.onFocus(e);\n        if (useragent.isEdge) setTimeout(resetSelection);\n        else resetSelection();\n      },\n      host,\n    );\n    this.$focusScroll = false;\n    this.focus = function () {\n      this.setAriaOptions({\n        setLabel: host.renderer.enableKeyboardAccessibility,\n      });\n      if (tempStyle || HAS_FOCUS_ARGS || this.$focusScroll == \"browser\")\n        return text.focus({ preventScroll: true });\n      var top = text.style.top;\n      text.style.position = \"fixed\";\n      text.style.top = \"0px\";\n      try {\n        var isTransformed = text.getBoundingClientRect().top != 0;\n      } catch (e) {\n        return;\n      }\n      var ancestors = [];\n      if (isTransformed) {\n        var t = text.parentElement;\n        while (t && t.nodeType == 1) {\n          ancestors.push(t);\n          t.setAttribute(\"ace_nocontext\", \"true\");\n          if (!t.parentElement && t.getRootNode) t = t.getRootNode()[\"host\"];\n          else t = t.parentElement;\n        }\n      }\n      text.focus({ preventScroll: true });\n      if (isTransformed) {\n        ancestors.forEach(function (p) {\n          p.removeAttribute(\"ace_nocontext\");\n        });\n      }\n      setTimeout(function () {\n        text.style.position = \"\";\n        if (text.style.top == \"0px\") text.style.top = top;\n      }, 0);\n    };\n    this.blur = function () {\n      text.blur();\n    };\n    this.isFocused = function () {\n      return isFocused;\n    };\n    host.on(\"beforeEndOperation\", function () {\n      var curOp = host.curOp;\n      var commandName = curOp && curOp.command && curOp.command.name;\n      if (commandName == \"insertstring\") return;\n      var isUserAction =\n        commandName && (curOp.docChanged || curOp.selectionChanged);\n      if (inComposition && isUserAction) {\n        lastValue = text.value = \"\";\n        onCompositionEnd();\n      }\n      resetSelection();\n    });\n    var positionToSelection = function (row, column) {\n      var selection = column;\n      for (\n        var i = 1;\n        i <= row - rowStart && i < 2 * numberOfExtraLines + 1;\n        i++\n      ) {\n        selection += host.session.getLine(row - i).length + 1;\n      }\n      return selection;\n    };\n    var resetSelection = isIOS\n      ? function (value) {\n          if (!isFocused || (copied && !value) || sendingText) return;\n          if (!value) value = \"\";\n          var newValue = \"\\n ab\" + value + \"cde fg\\n\";\n          if (newValue != text.value) text.value = lastValue = newValue;\n          var selectionStart = 4;\n          var selectionEnd =\n            4 + (value.length || (host.selection.isEmpty() ? 0 : 1));\n          if (\n            lastSelectionStart != selectionStart ||\n            lastSelectionEnd != selectionEnd\n          ) {\n            text.setSelectionRange(selectionStart, selectionEnd);\n          }\n          lastSelectionStart = selectionStart;\n          lastSelectionEnd = selectionEnd;\n        }\n      : function () {\n          if (inComposition || sendingText) return;\n          if (!isFocused && !afterContextMenu) return;\n          inComposition = true;\n          var selectionStart = 0;\n          var selectionEnd = 0;\n          var line = \"\";\n          if (host.session) {\n            var selection = host.selection;\n            var range = selection.getRange();\n            var row = selection.cursor.row;\n            if (row === rowEnd + 1) {\n              rowStart = rowEnd + 1;\n              rowEnd = rowStart + 2 * numberOfExtraLines;\n            } else if (row === rowStart - 1) {\n              rowEnd = rowStart - 1;\n              rowStart = rowEnd - 2 * numberOfExtraLines;\n            } else if (row < rowStart - 1 || row > rowEnd + 1) {\n              rowStart =\n                row > numberOfExtraLines ? row - numberOfExtraLines : 0;\n              rowEnd =\n                row > numberOfExtraLines\n                  ? row + numberOfExtraLines\n                  : 2 * numberOfExtraLines;\n            }\n            var lines = [];\n            for (var i = rowStart; i <= rowEnd; i++) {\n              lines.push(host.session.getLine(i));\n            }\n            line = lines.join(\"\\n\");\n            selectionStart = positionToSelection(\n              range.start.row,\n              range.start.column,\n            );\n            selectionEnd = positionToSelection(range.end.row, range.end.column);\n            if (range.start.row < rowStart) {\n              var prevLine = host.session.getLine(rowStart - 1);\n              selectionStart =\n                range.start.row < rowStart - 1 ? 0 : selectionStart;\n              selectionEnd += prevLine.length + 1;\n              line = prevLine + \"\\n\" + line;\n            } else if (range.end.row > rowEnd) {\n              var nextLine = host.session.getLine(rowEnd + 1);\n              selectionEnd =\n                range.end.row > rowEnd + 1 ? nextLine.length : range.end.column;\n              selectionEnd += line.length + 1;\n              line = line + \"\\n\" + nextLine;\n            } else if (isMobile && row > 0) {\n              line = \"\\n\" + line;\n              selectionEnd += 1;\n              selectionStart += 1;\n            }\n            if (line.length > MAX_LINE_LENGTH) {\n              if (\n                selectionStart < MAX_LINE_LENGTH &&\n                selectionEnd < MAX_LINE_LENGTH\n              ) {\n                line = line.slice(0, MAX_LINE_LENGTH);\n              } else {\n                line = \"\\n\";\n                if (selectionStart == selectionEnd) {\n                  selectionStart = selectionEnd = 0;\n                } else {\n                  selectionStart = 0;\n                  selectionEnd = 1;\n                }\n              }\n            }\n            var newValue = line + \"\\n\\n\";\n            if (newValue != lastValue) {\n              text.value = lastValue = newValue;\n              lastSelectionStart = lastSelectionEnd = newValue.length;\n            }\n          }\n          if (afterContextMenu) {\n            lastSelectionStart = text.selectionStart;\n            lastSelectionEnd = text.selectionEnd;\n          }\n          if (\n            lastSelectionEnd != selectionEnd ||\n            lastSelectionStart != selectionStart ||\n            text.selectionEnd != lastSelectionEnd // on ie edge selectionEnd changes silently after the initialization\n          ) {\n            try {\n              text.setSelectionRange(selectionStart, selectionEnd);\n              lastSelectionStart = selectionStart;\n              lastSelectionEnd = selectionEnd;\n            } catch (e) {}\n          }\n          inComposition = false;\n        };\n    this.resetSelection = resetSelection;\n    if (isFocused) host.onFocus();\n    var isAllSelected = function (text) {\n      return (\n        text.selectionStart === 0 &&\n        text.selectionEnd >= lastValue.length &&\n        text.value === lastValue &&\n        lastValue &&\n        text.selectionEnd !== lastSelectionEnd\n      );\n    };\n    var onSelect = function (e) {\n      if (inComposition) return;\n      if (copied) {\n        copied = false;\n      } else if (isAllSelected(text)) {\n        host.selectAll();\n        resetSelection();\n      } else if (isMobile && text.selectionStart != lastSelectionStart) {\n        resetSelection();\n      }\n    };\n    var inputHandler = null;\n    this.setInputHandler = function (cb) {\n      inputHandler = cb;\n    };\n    this.getInputHandler = function () {\n      return inputHandler;\n    };\n    var afterContextMenu = false;\n    var sendText = function (value, fromInput) {\n      if (afterContextMenu) afterContextMenu = false;\n      if (pasted) {\n        resetSelection();\n        if (value) host.onPaste(value);\n        pasted = false;\n        return \"\";\n      } else {\n        var selectionStart = text.selectionStart;\n        var selectionEnd = text.selectionEnd;\n        var extendLeft = lastSelectionStart;\n        var extendRight = lastValue.length - lastSelectionEnd;\n        var inserted = value;\n        var restoreStart = value.length - selectionStart;\n        var restoreEnd = value.length - selectionEnd;\n        var i = 0;\n        while (extendLeft > 0 && lastValue[i] == value[i]) {\n          i++;\n          extendLeft--;\n        }\n        inserted = inserted.slice(i);\n        i = 1;\n        while (\n          extendRight > 0 &&\n          lastValue.length - i > lastSelectionStart - 1 &&\n          lastValue[lastValue.length - i] == value[value.length - i]\n        ) {\n          i++;\n          extendRight--;\n        }\n        restoreStart -= i - 1;\n        restoreEnd -= i - 1;\n        var endIndex = inserted.length - i + 1;\n        if (endIndex < 0) {\n          extendLeft = -endIndex;\n          endIndex = 0;\n        }\n        inserted = inserted.slice(0, endIndex);\n        if (\n          !fromInput &&\n          !inserted &&\n          !restoreStart &&\n          !extendLeft &&\n          !extendRight &&\n          !restoreEnd\n        )\n          return \"\";\n        sendingText = true;\n        var shouldReset = false;\n        if (useragent.isAndroid && inserted == \". \") {\n          inserted = \"  \";\n          shouldReset = true;\n        }\n        if (\n          (inserted &&\n            !extendLeft &&\n            !extendRight &&\n            !restoreStart &&\n            !restoreEnd) ||\n          commandMode\n        ) {\n          host.onTextInput(inserted);\n        } else {\n          host.onTextInput(inserted, {\n            extendLeft: extendLeft,\n            extendRight: extendRight,\n            restoreStart: restoreStart,\n            restoreEnd: restoreEnd,\n          });\n        }\n        sendingText = false;\n        lastValue = value;\n        lastSelectionStart = selectionStart;\n        lastSelectionEnd = selectionEnd;\n        lastRestoreEnd = restoreEnd;\n        return shouldReset ? \"\\n\" : inserted;\n      }\n    };\n    var onInput = function (e) {\n      if (inComposition) return onCompositionUpdate();\n      if (e && e.inputType) {\n        if (e.inputType == \"historyUndo\") return host.execCommand(\"undo\");\n        if (e.inputType == \"historyRedo\") return host.execCommand(\"redo\");\n      }\n      var data = text.value;\n      var inserted = sendText(data, true);\n      if (\n        data.length > MAX_LINE_LENGTH + 100 ||\n        valueResetRegex.test(inserted) ||\n        (isMobile &&\n          lastSelectionStart < 1 &&\n          lastSelectionStart == lastSelectionEnd)\n      ) {\n        resetSelection();\n      }\n    };\n    var handleClipboardData = function (e, data, forceIEMime) {\n      var clipboardData = e.clipboardData || window[\"clipboardData\"];\n      if (!clipboardData || BROKEN_SETDATA) return;\n      var mime = USE_IE_MIME_TYPE || forceIEMime ? \"Text\" : \"text/plain\";\n      try {\n        if (data) {\n          return clipboardData.setData(mime, data) !== false;\n        } else {\n          return clipboardData.getData(mime);\n        }\n      } catch (e) {\n        if (!forceIEMime) return handleClipboardData(e, data, true);\n      }\n    };\n    var doCopy = function (e, isCut) {\n      var data = host.getCopyText();\n      if (!data) return event.preventDefault(e);\n      if (handleClipboardData(e, data)) {\n        if (isIOS) {\n          resetSelection(data);\n          copied = data;\n          setTimeout(function () {\n            copied = false;\n          }, 10);\n        }\n        isCut ? host.onCut() : host.onCopy();\n        event.preventDefault(e);\n      } else {\n        copied = true;\n        text.value = data;\n        text.select();\n        setTimeout(function () {\n          copied = false;\n          resetSelection();\n          isCut ? host.onCut() : host.onCopy();\n        });\n      }\n    };\n    var onCut = function (e) {\n      doCopy(e, true);\n    };\n    var onCopy = function (e) {\n      doCopy(e, false);\n    };\n    var onPaste = function (e) {\n      var data = handleClipboardData(e);\n      if (clipboard.pasteCancelled()) return;\n      if (typeof data == \"string\") {\n        if (data) host.onPaste(data, e);\n        if (useragent.isIE) setTimeout(resetSelection);\n        event.preventDefault(e);\n      } else {\n        text.value = \"\";\n        pasted = true;\n      }\n    };\n    event.addCommandKeyListener(text, host.onCommandKey.bind(host), host);\n    event.addListener(text, \"select\", onSelect, host);\n    event.addListener(text, \"input\", onInput, host);\n    event.addListener(text, \"cut\", onCut, host);\n    event.addListener(text, \"copy\", onCopy, host);\n    event.addListener(text, \"paste\", onPaste, host);\n    if (!(\"oncut\" in text) || !(\"oncopy\" in text) || !(\"onpaste\" in text)) {\n      event.addListener(\n        parentNode,\n        \"keydown\",\n        function (e) {\n          if ((useragent.isMac && !e.metaKey) || !e.ctrlKey) return;\n          switch (e.keyCode) {\n            case 67:\n              onCopy(e);\n              break;\n            case 86:\n              onPaste(e);\n              break;\n            case 88:\n              onCut(e);\n              break;\n          }\n        },\n        host,\n      );\n    }\n    var onCompositionStart = function (e) {\n      if (inComposition || !host.onCompositionStart || host.$readOnly) return;\n      inComposition = {};\n      if (commandMode) return;\n      if (e.data) inComposition.useTextareaForIME = false;\n      setTimeout(onCompositionUpdate, 0);\n      host._signal(\"compositionStart\");\n      host.on(\"mousedown\", cancelComposition);\n      var range = host.getSelectionRange();\n      range.end.row = range.start.row;\n      range.end.column = range.start.column;\n      inComposition.markerRange = range;\n      inComposition.selectionStart = lastSelectionStart;\n      host.onCompositionStart(inComposition);\n      if (inComposition.useTextareaForIME) {\n        lastValue = text.value = \"\";\n        lastSelectionStart = 0;\n        lastSelectionEnd = 0;\n      } else {\n        if (text.msGetInputContext)\n          inComposition.context = text.msGetInputContext();\n        if (text.getInputContext)\n          inComposition.context = text.getInputContext();\n      }\n    };\n    var onCompositionUpdate = function () {\n      if (!inComposition || !host.onCompositionUpdate || host.$readOnly) return;\n      if (commandMode) return cancelComposition();\n      if (inComposition.useTextareaForIME) {\n        host.onCompositionUpdate(text.value);\n      } else {\n        var data = text.value;\n        sendText(data);\n        if (inComposition.markerRange) {\n          if (inComposition.context) {\n            inComposition.markerRange.start.column =\n              inComposition.selectionStart =\n                inComposition.context.compositionStartOffset;\n          }\n          inComposition.markerRange.end.column =\n            inComposition.markerRange.start.column +\n            lastSelectionEnd -\n            inComposition.selectionStart +\n            lastRestoreEnd;\n        }\n      }\n    };\n    var onCompositionEnd = function (e) {\n      if (!host.onCompositionEnd || host.$readOnly) return;\n      inComposition = false;\n      host.onCompositionEnd();\n      host.off(\"mousedown\", cancelComposition);\n      if (e) onInput();\n    };\n    function cancelComposition() {\n      ignoreFocusEvents = true;\n      text.blur();\n      text.focus();\n      ignoreFocusEvents = false;\n    }\n    var syncComposition = lang\n      .delayedCall(onCompositionUpdate, 50)\n      .schedule.bind(null, null);\n    function onKeyup(e) {\n      if (e.keyCode == 27 && text.value.length < text.selectionStart) {\n        if (!inComposition) lastValue = text.value;\n        lastSelectionStart = lastSelectionEnd = -1;\n        resetSelection();\n      }\n      syncComposition();\n    }\n    event.addListener(text, \"compositionstart\", onCompositionStart, host);\n    event.addListener(text, \"compositionupdate\", onCompositionUpdate, host);\n    event.addListener(text, \"keyup\", onKeyup, host);\n    event.addListener(text, \"keydown\", syncComposition, host);\n    event.addListener(text, \"compositionend\", onCompositionEnd, host);\n    this.getElement = function () {\n      return text;\n    };\n    this.setCommandMode = function (value) {\n      commandMode = value;\n      text.readOnly = false;\n    };\n    this.setReadOnly = function (readOnly) {\n      if (!commandMode) text.readOnly = readOnly;\n    };\n    this.setCopyWithEmptySelection = function (value) {};\n    this.onContextMenu = function (e) {\n      afterContextMenu = true;\n      resetSelection();\n      host._emit(\"nativecontextmenu\", { target: host, domEvent: e });\n      this.moveToMouse(e, true);\n    };\n    this.moveToMouse = function (e, bringToFront) {\n      if (!tempStyle) tempStyle = text.style.cssText;\n      text.style.cssText =\n        (bringToFront ? \"z-index:100000;\" : \"\") +\n        (useragent.isIE ? \"opacity:0.1;\" : \"\") +\n        \"text-indent: -\" +\n        (lastSelectionStart + lastSelectionEnd) *\n          host.renderer.characterWidth *\n          0.5 +\n        \"px;\";\n      var rect = host.container.getBoundingClientRect();\n      var style = dom.computedStyle(host.container);\n      var top = rect.top + (parseInt(style.borderTopWidth) || 0);\n      var left = rect.left + (parseInt(rect.borderLeftWidth) || 0);\n      var maxTop = rect.bottom - top - text.clientHeight - 2;\n      var move = function (e) {\n        dom.translate(\n          text,\n          e.clientX - left - 2,\n          Math.min(e.clientY - top - 2, maxTop),\n        );\n      };\n      move(e);\n      if (e.type != \"mousedown\") return;\n      host.renderer.$isMousePressed = true;\n      clearTimeout(closeTimeout);\n      if (useragent.isWin)\n        event.capture(host.container, move, onContextMenuClose);\n    };\n    this.onContextMenuClose = onContextMenuClose;\n    var closeTimeout;\n    function onContextMenuClose() {\n      clearTimeout(closeTimeout);\n      closeTimeout = setTimeout(function () {\n        if (tempStyle) {\n          text.style.cssText = tempStyle;\n          tempStyle = \"\";\n        }\n        host.renderer.$isMousePressed = false;\n        if (host.renderer.$keepTextAreaAtCursor)\n          host.renderer.$moveTextAreaToCursor();\n      }, 0);\n    }\n    var onContextMenu = function (e) {\n      host.textInput.onContextMenu(e);\n      onContextMenuClose();\n    };\n    event.addListener(text, \"mouseup\", onContextMenu, host);\n    event.addListener(\n      text,\n      \"mousedown\",\n      function (e) {\n        e.preventDefault();\n        onContextMenuClose();\n      },\n      host,\n    );\n    event.addListener(\n      host.renderer.scroller,\n      \"contextmenu\",\n      onContextMenu,\n      host,\n    );\n    event.addListener(text, \"contextmenu\", onContextMenu, host);\n    if (isIOS) addIosSelectionHandler(parentNode, host, text);\n    function addIosSelectionHandler(parentNode, host, text) {\n      var typingResetTimeout = null;\n      var typing = false;\n      text.addEventListener(\n        \"keydown\",\n        function (e) {\n          if (typingResetTimeout) clearTimeout(typingResetTimeout);\n          typing = true;\n        },\n        true,\n      );\n      text.addEventListener(\n        \"keyup\",\n        function (e) {\n          typingResetTimeout = setTimeout(function () {\n            typing = false;\n          }, 100);\n        },\n        true,\n      );\n      var detectArrowKeys = function (e) {\n        if (document.activeElement !== text) return;\n        if (typing || inComposition || host.$mouseHandler.isMousePressed)\n          return;\n        if (copied) {\n          return;\n        }\n        var selectionStart = text.selectionStart;\n        var selectionEnd = text.selectionEnd;\n        var key = null;\n        var modifier = 0;\n        if (selectionStart == 0) {\n          key = KEYS.up;\n        } else if (selectionStart == 1) {\n          key = KEYS.home;\n        } else if (\n          selectionEnd > lastSelectionEnd &&\n          lastValue[selectionEnd] == \"\\n\"\n        ) {\n          key = KEYS.end;\n        } else if (\n          selectionStart < lastSelectionStart &&\n          lastValue[selectionStart - 1] == \" \"\n        ) {\n          key = KEYS.left;\n          modifier = MODS.option;\n        } else if (\n          selectionStart < lastSelectionStart ||\n          (selectionStart == lastSelectionStart &&\n            lastSelectionEnd != lastSelectionStart &&\n            selectionStart == selectionEnd)\n        ) {\n          key = KEYS.left;\n        } else if (\n          selectionEnd > lastSelectionEnd &&\n          lastValue.slice(0, selectionEnd).split(\"\\n\").length > 2\n        ) {\n          key = KEYS.down;\n        } else if (\n          selectionEnd > lastSelectionEnd &&\n          lastValue[selectionEnd - 1] == \" \"\n        ) {\n          key = KEYS.right;\n          modifier = MODS.option;\n        } else if (\n          selectionEnd > lastSelectionEnd ||\n          (selectionEnd == lastSelectionEnd &&\n            lastSelectionEnd != lastSelectionStart &&\n            selectionStart == selectionEnd)\n        ) {\n          key = KEYS.right;\n        }\n        if (selectionStart !== selectionEnd) modifier |= MODS.shift;\n        if (key) {\n          var result = host.onCommandKey({}, modifier, key);\n          if (!result && host.commands) {\n            key = KEYS.keyCodeToString(key);\n            var command = host.commands.findKeyCommand(modifier, key);\n            if (command) host.execCommand(command);\n          }\n          lastSelectionStart = selectionStart;\n          lastSelectionEnd = selectionEnd;\n          resetSelection(\"\");\n        }\n      };\n      document.addEventListener(\"selectionchange\", detectArrowKeys);\n      host.on(\"destroy\", function () {\n        document.removeEventListener(\"selectionchange\", detectArrowKeys);\n      });\n    }\n    this.destroy = function () {\n      if (text.parentElement) text.parentElement.removeChild(text);\n    };\n  };\n  exports.TextInput = TextInput;\n  exports.$setUserAgentForTests = function (_isMobile, _isIOS) {\n    isMobile = _isMobile;\n    isIOS = _isIOS;\n  };\n});\n\ndefine(\"ace/mouse/default_handlers\", [\n  \"require\",\n  \"exports\",\n  \"module\",\n  \"ace/lib/useragent\",\n], function (require, exports, module) {\n  \"use strict\";\n  var useragent = require(\"../lib/useragent\");\n  var DRAG_OFFSET = 0; // pixels\n  var SCROLL_COOLDOWN_T = 550; // milliseconds\n  var DefaultHandlers = /** @class */ (function () {\n    function DefaultHandlers(mouseHandler) {\n      mouseHandler.$clickSelection = null;\n      var editor = mouseHandler.editor;\n      editor.setDefaultHandler(\n        \"mousedown\",\n        this.onMouseDown.bind(mouseHandler),\n      );\n      editor.setDefaultHandler(\n        \"dblclick\",\n        this.onDoubleClick.bind(mouseHandler),\n      );\n      editor.setDefaultHandler(\n        \"tripleclick\",\n        this.onTripleClick.bind(mouseHandler),\n      );\n      editor.setDefaultHandler(\n        \"quadclick\",\n        this.onQuadClick.bind(mouseHandler),\n      );\n      editor.setDefaultHandler(\n        \"mousewheel\",\n        this.onMouseWheel.bind(mouseHandler),\n      );\n      var exports = [\n        \"select\",\n        \"startSelect\",\n        \"selectEnd\",\n        \"selectAllEnd\",\n        \"selectByWordsEnd\",\n        \"selectByLinesEnd\",\n        \"dragWait\",\n        \"dragWaitEnd\",\n        \"focusWait\",\n      ];\n      exports.forEach(function (x) {\n        mouseHandler[x] = this[x];\n      }, this);\n      mouseHandler[\"selectByLines\"] = this.extendSelectionBy.bind(\n        mouseHandler,\n        \"getLineRange\",\n      );\n      mouseHandler[\"selectByWords\"] = this.extendSelectionBy.bind(\n        mouseHandler,\n        \"getWordRange\",\n      );\n    }\n    DefaultHandlers.prototype.onMouseDown = function (ev) {\n      var inSelection = ev.inSelection();\n      var pos = ev.getDocumentPosition();\n      this.mousedownEvent = ev;\n      var editor = this.editor;\n      var button = ev.getButton();\n      if (button !== 0) {\n        var selectionRange = editor.getSelectionRange();\n        var selectionEmpty = selectionRange.isEmpty();\n        if (selectionEmpty || button == 1) editor.selection.moveToPosition(pos);\n        if (button == 2) {\n          editor.textInput.onContextMenu(ev.domEvent);\n          if (!useragent.isMozilla) ev.preventDefault();\n        }\n        return;\n      }\n      this.mousedownEvent.time = Date.now();\n      if (inSelection && !editor.isFocused()) {\n        editor.focus();\n        if (\n          this.$focusTimeout &&\n          !this.$clickSelection &&\n          !editor.inMultiSelectMode\n        ) {\n          this.setState(\"focusWait\");\n          this.captureMouse(ev);\n          return;\n        }\n      }\n      this.captureMouse(ev);\n      this.startSelect(pos, ev.domEvent._clicks > 1);\n      return ev.preventDefault();\n    };\n    DefaultHandlers.prototype.startSelect = function (\n      pos,\n      waitForClickSelection,\n    ) {\n      pos = pos || this.editor.renderer.screenToTextCoordinates(this.x, this.y);\n      var editor = this.editor;\n      if (!this.mousedownEvent) return;\n      if (this.mousedownEvent.getShiftKey())\n        editor.selection.selectToPosition(pos);\n      else if (!waitForClickSelection) editor.selection.moveToPosition(pos);\n      if (!waitForClickSelection) this.select();\n      editor.setStyle(\"ace_selecting\");\n      this.setState(\"select\");\n    };\n    DefaultHandlers.prototype.select = function () {\n      var anchor,\n        editor = this.editor;\n      var cursor = editor.renderer.screenToTextCoordinates(this.x, this.y);\n      if (this.$clickSelection) {\n        var cmp = this.$clickSelection.comparePoint(cursor);\n        if (cmp == -1) {\n          anchor = this.$clickSelection.end;\n        } else if (cmp == 1) {\n          anchor = this.$clickSelection.start;\n        } else {\n          var orientedRange = calcRangeOrientation(\n            this.$clickSelection,\n            cursor,\n          );\n          cursor = orientedRange.cursor;\n          anchor = orientedRange.anchor;\n        }\n        editor.selection.setSelectionAnchor(anchor.row, anchor.column);\n      }\n      editor.selection.selectToPosition(cursor);\n      editor.renderer.scrollCursorIntoView();\n    };\n    DefaultHandlers.prototype.extendSelectionBy = function (unitName) {\n      var anchor,\n        editor = this.editor;\n      var cursor = editor.renderer.screenToTextCoordinates(this.x, this.y);\n      var range = editor.selection[unitName](cursor.row, cursor.column);\n      if (this.$clickSelection) {\n        var cmpStart = this.$clickSelection.comparePoint(range.start);\n        var cmpEnd = this.$clickSelection.comparePoint(range.end);\n        if (cmpStart == -1 && cmpEnd <= 0) {\n          anchor = this.$clickSelection.end;\n          if (range.end.row != cursor.row || range.end.column != cursor.column)\n            cursor = range.start;\n        } else if (cmpEnd == 1 && cmpStart >= 0) {\n          anchor = this.$clickSelection.start;\n          if (\n            range.start.row != cursor.row ||\n            range.start.column != cursor.column\n          )\n            cursor = range.end;\n        } else if (cmpStart == -1 && cmpEnd == 1) {\n          cursor = range.end;\n          anchor = range.start;\n        } else {\n          var orientedRange = calcRangeOrientation(\n            this.$clickSelection,\n            cursor,\n          );\n          cursor = orientedRange.cursor;\n          anchor = orientedRange.anchor;\n        }\n        editor.selection.setSelectionAnchor(anchor.row, anchor.column);\n      }\n      editor.selection.selectToPosition(cursor);\n      editor.renderer.scrollCursorIntoView();\n    };\n    DefaultHandlers.prototype.selectByLinesEnd = function () {\n      this.$clickSelection = null;\n      this.editor.unsetStyle(\"ace_selecting\");\n    };\n    DefaultHandlers.prototype.focusWait = function () {\n      var distance = calcDistance(\n        this.mousedownEvent.x,\n        this.mousedownEvent.y,\n        this.x,\n        this.y,\n      );\n      var time = Date.now();\n      if (\n        distance > DRAG_OFFSET ||\n        time - this.mousedownEvent.time > this.$focusTimeout\n      )\n        this.startSelect(this.mousedownEvent.getDocumentPosition());\n    };\n    DefaultHandlers.prototype.onDoubleClick = function (ev) {\n      var pos = ev.getDocumentPosition();\n      var editor = this.editor;\n      var session = editor.session;\n      var range = session.getBracketRange(pos);\n      if (range) {\n        if (range.isEmpty()) {\n          range.start.column--;\n          range.end.column++;\n        }\n        this.setState(\"select\");\n      } else {\n        range = editor.selection.getWordRange(pos.row, pos.column);\n        this.setState(\"selectByWords\");\n      }\n      this.$clickSelection = range;\n      this.select();\n    };\n    DefaultHandlers.prototype.onTripleClick = function (ev) {\n      var pos = ev.getDocumentPosition();\n      var editor = this.editor;\n      this.setState(\"selectByLines\");\n      var range = editor.getSelectionRange();\n      if (range.isMultiLine() && range.contains(pos.row, pos.column)) {\n        this.$clickSelection = editor.selection.getLineRange(range.start.row);\n        this.$clickSelection.end = editor.selection.getLineRange(\n          range.end.row,\n        ).end;\n      } else {\n        this.$clickSelection = editor.selection.getLineRange(pos.row);\n      }\n      this.select();\n    };\n    DefaultHandlers.prototype.onQuadClick = function (ev) {\n      var editor = this.editor;\n      editor.selectAll();\n      this.$clickSelection = editor.getSelectionRange();\n      this.setState(\"selectAll\");\n    };\n    DefaultHandlers.prototype.onMouseWheel = function (ev) {\n      if (ev.getAccelKey()) return;\n      if (ev.getShiftKey() && ev.wheelY && !ev.wheelX) {\n        ev.wheelX = ev.wheelY;\n        ev.wheelY = 0;\n      }\n      var editor = this.editor;\n      if (!this.$lastScroll)\n        this.$lastScroll = { t: 0, vx: 0, vy: 0, allowed: 0 };\n      var prevScroll = this.$lastScroll;\n      var t = ev.domEvent.timeStamp;\n      var dt = t - prevScroll.t;\n      var vx = dt ? ev.wheelX / dt : prevScroll.vx;\n      var vy = dt ? ev.wheelY / dt : prevScroll.vy;\n      if (dt < SCROLL_COOLDOWN_T) {\n        vx = (vx + prevScroll.vx) / 2;\n        vy = (vy + prevScroll.vy) / 2;\n      }\n      var direction = Math.abs(vx / vy);\n      var canScroll = false;\n      if (\n        direction >= 1 &&\n        editor.renderer.isScrollableBy(ev.wheelX * ev.speed, 0)\n      )\n        canScroll = true;\n      if (\n        direction <= 1 &&\n        editor.renderer.isScrollableBy(0, ev.wheelY * ev.speed)\n      )\n        canScroll = true;\n      if (canScroll) {\n        prevScroll.allowed = t;\n      } else if (t - prevScroll.allowed < SCROLL_COOLDOWN_T) {\n        var isSlower =\n          Math.abs(vx) <= 1.5 * Math.abs(prevScroll.vx) &&\n          Math.abs(vy) <= 1.5 * Math.abs(prevScroll.vy);\n        if (isSlower) {\n          canScroll = true;\n          prevScroll.allowed = t;\n        } else {\n          prevScroll.allowed = 0;\n        }\n      }\n      prevScroll.t = t;\n      prevScroll.vx = vx;\n      prevScroll.vy = vy;\n      if (canScroll) {\n        editor.renderer.scrollBy(ev.wheelX * ev.speed, ev.wheelY * ev.speed);\n        return ev.stop();\n      }\n    };\n    return DefaultHandlers;\n  })();\n  DefaultHandlers.prototype.selectEnd =\n    DefaultHandlers.prototype.selectByLinesEnd;\n  DefaultHandlers.prototype.selectAllEnd =\n    DefaultHandlers.prototype.selectByLinesEnd;\n  DefaultHandlers.prototype.selectByWordsEnd =\n    DefaultHandlers.prototype.selectByLinesEnd;\n  exports.DefaultHandlers = DefaultHandlers;\n  function calcDistance(ax, ay, bx, by) {\n    return Math.sqrt(Math.pow(bx - ax, 2) + Math.pow(by - ay, 2));\n  }\n  function calcRangeOrientation(range, cursor) {\n    if (range.start.row == range.end.row)\n      var cmp = 2 * cursor.column - range.start.column - range.end.column;\n    else if (\n      range.start.row == range.end.row - 1 &&\n      !range.start.column &&\n      !range.end.column\n    )\n      var cmp = cursor.column - 4;\n    else var cmp = 2 * cursor.row - range.start.row - range.end.row;\n    if (cmp < 0) return { cursor: range.start, anchor: range.end };\n    else return { cursor: range.end, anchor: range.start };\n  }\n});\n\ndefine(\"ace/lib/scroll\", [\"require\", \"exports\", \"module\"], function (\n  require,\n  exports,\n  module,\n) {\n  exports.preventParentScroll = function preventParentScroll(event) {\n    event.stopPropagation();\n    var target = event.currentTarget;\n    var contentOverflows = target.scrollHeight > target.clientHeight;\n    if (!contentOverflows) {\n      event.preventDefault();\n    }\n  };\n});\n\ndefine(\"ace/tooltip\", [\n  \"require\",\n  \"exports\",\n  \"module\",\n  \"ace/lib/dom\",\n  \"ace/lib/event\",\n  \"ace/range\",\n  \"ace/lib/scroll\",\n], function (require, exports, module) {\n  \"use strict\";\n  var __extends =\n    (this && this.__extends) ||\n    (function () {\n      var extendStatics = function (d, b) {\n        extendStatics =\n          Object.setPrototypeOf ||\n          ({ __proto__: [] } instanceof Array &&\n            function (d, b) {\n              d.__proto__ = b;\n            }) ||\n          function (d, b) {\n            for (var p in b)\n              if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p];\n          };\n        return extendStatics(d, b);\n      };\n      return function (d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\n            \"Class extends value \" +\n              String(b) +\n              \" is not a constructor or null\",\n          );\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype =\n          b === null\n            ? Object.create(b)\n            : ((__.prototype = b.prototype), new __());\n      };\n    })();\n  var __values =\n    (this && this.__values) ||\n    function (o) {\n      var s = typeof Symbol === \"function\" && Symbol.iterator,\n        m = s && o[s],\n        i = 0;\n      if (m) return m.call(o);\n      if (o && typeof o.length === \"number\")\n        return {\n          next: function () {\n            if (o && i >= o.length) o = void 0;\n            return { value: o && o[i++], done: !o };\n          },\n        };\n      throw new TypeError(\n        s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\",\n      );\n    };\n  var dom = require(\"./lib/dom\");\n  var event = require(\"./lib/event\");\n  var Range = require(\"./range\").Range;\n  var preventParentScroll = require(\"./lib/scroll\").preventParentScroll;\n  var CLASSNAME = \"ace_tooltip\";\n  var Tooltip = /** @class */ (function () {\n    function Tooltip(parentNode) {\n      this.isOpen = false;\n      this.$element = null;\n      this.$parentNode = parentNode;\n    }\n    Tooltip.prototype.$init = function () {\n      this.$element = dom.createElement(\"div\");\n      this.$element.className = CLASSNAME;\n      this.$element.style.display = \"none\";\n      this.$parentNode.appendChild(this.$element);\n      return this.$element;\n    };\n    Tooltip.prototype.getElement = function () {\n      return this.$element || this.$init();\n    };\n    Tooltip.prototype.setText = function (text) {\n      this.getElement().textContent = text;\n    };\n    Tooltip.prototype.setHtml = function (html) {\n      this.getElement().innerHTML = html;\n    };\n    Tooltip.prototype.setPosition = function (x, y) {\n      this.getElement().style.left = x + \"px\";\n      this.getElement().style.top = y + \"px\";\n    };\n    Tooltip.prototype.setClassName = function (className) {\n      dom.addCssClass(this.getElement(), className);\n    };\n    Tooltip.prototype.setTheme = function (theme) {\n      this.$element.className =\n        CLASSNAME +\n        \" \" +\n        (theme.isDark ? \"ace_dark \" : \"\") +\n        (theme.cssClass || \"\");\n    };\n    Tooltip.prototype.show = function (text, x, y) {\n      if (text != null) this.setText(text);\n      if (x != null && y != null) this.setPosition(x, y);\n      if (!this.isOpen) {\n        this.getElement().style.display = \"block\";\n        this.isOpen = true;\n      }\n    };\n    Tooltip.prototype.hide = function (e) {\n      if (this.isOpen) {\n        this.getElement().style.display = \"none\";\n        this.getElement().className = CLASSNAME;\n        this.isOpen = false;\n      }\n    };\n    Tooltip.prototype.getHeight = function () {\n      return this.getElement().offsetHeight;\n    };\n    Tooltip.prototype.getWidth = function () {\n      return this.getElement().offsetWidth;\n    };\n    Tooltip.prototype.destroy = function () {\n      this.isOpen = false;\n      if (this.$element && this.$element.parentNode) {\n        this.$element.parentNode.removeChild(this.$element);\n      }\n    };\n    return Tooltip;\n  })();\n  var PopupManager = /** @class */ (function () {\n    function PopupManager() {\n      this.popups = [];\n    }\n    PopupManager.prototype.addPopup = function (popup) {\n      this.popups.push(popup);\n      this.updatePopups();\n    };\n    PopupManager.prototype.removePopup = function (popup) {\n      var index = this.popups.indexOf(popup);\n      if (index !== -1) {\n        this.popups.splice(index, 1);\n        this.updatePopups();\n      }\n    };\n    PopupManager.prototype.updatePopups = function () {\n      var e_1, _a, e_2, _b;\n      this.popups.sort(function (a, b) {\n        return b.priority - a.priority;\n      });\n      var visiblepopups = [];\n      try {\n        for (\n          var _c = __values(this.popups), _d = _c.next();\n          !_d.done;\n          _d = _c.next()\n        ) {\n          var popup = _d.value;\n          var shouldDisplay = true;\n          try {\n            for (\n              var visiblepopups_1 = ((e_2 = void 0), __values(visiblepopups)),\n                visiblepopups_1_1 = visiblepopups_1.next();\n              !visiblepopups_1_1.done;\n              visiblepopups_1_1 = visiblepopups_1.next()\n            ) {\n              var visiblePopup = visiblepopups_1_1.value;\n              if (this.doPopupsOverlap(visiblePopup, popup)) {\n                shouldDisplay = false;\n                break;\n              }\n            }\n          } catch (e_2_1) {\n            e_2 = { error: e_2_1 };\n          } finally {\n            try {\n              if (\n                visiblepopups_1_1 &&\n                !visiblepopups_1_1.done &&\n                (_b = visiblepopups_1.return)\n              )\n                _b.call(visiblepopups_1);\n            } finally {\n              if (e_2) throw e_2.error;\n            }\n          }\n          if (shouldDisplay) {\n            visiblepopups.push(popup);\n          } else {\n            popup.hide();\n          }\n        }\n      } catch (e_1_1) {\n        e_1 = { error: e_1_1 };\n      } finally {\n        try {\n          if (_d && !_d.done && (_a = _c.return)) _a.call(_c);\n        } finally {\n          if (e_1) throw e_1.error;\n        }\n      }\n    };\n    PopupManager.prototype.doPopupsOverlap = function (popupA, popupB) {\n      var rectA = popupA.getElement().getBoundingClientRect();\n      var rectB = popupB.getElement().getBoundingClientRect();\n      return (\n        rectA.left < rectB.right &&\n        rectA.right > rectB.left &&\n        rectA.top < rectB.bottom &&\n        rectA.bottom > rectB.top\n      );\n    };\n    return PopupManager;\n  })();\n  var popupManager = new PopupManager();\n  exports.popupManager = popupManager;\n  exports.Tooltip = Tooltip;\n  var HoverTooltip = /** @class */ (function (_super) {\n    __extends(HoverTooltip, _super);\n    function HoverTooltip(parentNode) {\n      if (parentNode === void 0) {\n        parentNode = document.body;\n      }\n      var _this = _super.call(this, parentNode) || this;\n      _this.timeout = undefined;\n      _this.lastT = 0;\n      _this.idleTime = 350;\n      _this.lastEvent = undefined;\n      _this.onMouseOut = _this.onMouseOut.bind(_this);\n      _this.onMouseMove = _this.onMouseMove.bind(_this);\n      _this.waitForHover = _this.waitForHover.bind(_this);\n      _this.hide = _this.hide.bind(_this);\n      var el = _this.getElement();\n      el.style.whiteSpace = \"pre-wrap\";\n      el.style.pointerEvents = \"auto\";\n      el.addEventListener(\"mouseout\", _this.onMouseOut);\n      el.tabIndex = -1;\n      el.addEventListener(\n        \"blur\",\n        function () {\n          if (!el.contains(document.activeElement)) this.hide();\n        }.bind(_this),\n      );\n      el.addEventListener(\"wheel\", preventParentScroll);\n      return _this;\n    }\n    HoverTooltip.prototype.addToEditor = function (editor) {\n      editor.on(\"mousemove\", this.onMouseMove);\n      editor.on(\"mousedown\", this.hide);\n      editor.renderer\n        .getMouseEventTarget()\n        .addEventListener(\"mouseout\", this.onMouseOut, true);\n    };\n    HoverTooltip.prototype.removeFromEditor = function (editor) {\n      editor.off(\"mousemove\", this.onMouseMove);\n      editor.off(\"mousedown\", this.hide);\n      editor.renderer\n        .getMouseEventTarget()\n        .removeEventListener(\"mouseout\", this.onMouseOut, true);\n      if (this.timeout) {\n        clearTimeout(this.timeout);\n        this.timeout = null;\n      }\n    };\n    HoverTooltip.prototype.onMouseMove = function (e, editor) {\n      this.lastEvent = e;\n      this.lastT = Date.now();\n      var isMousePressed = editor.$mouseHandler.isMousePressed;\n      if (this.isOpen) {\n        var pos = this.lastEvent && this.lastEvent.getDocumentPosition();\n        if (\n          !this.range ||\n          !this.range.contains(pos.row, pos.column) ||\n          isMousePressed ||\n          this.isOutsideOfText(this.lastEvent)\n        ) {\n          this.hide();\n        }\n      }\n      if (this.timeout || isMousePressed) return;\n      this.lastEvent = e;\n      this.timeout = setTimeout(this.waitForHover, this.idleTime);\n    };\n    HoverTooltip.prototype.waitForHover = function () {\n      if (this.timeout) clearTimeout(this.timeout);\n      var dt = Date.now() - this.lastT;\n      if (this.idleTime - dt > 10) {\n        this.timeout = setTimeout(this.waitForHover, this.idleTime - dt);\n        return;\n      }\n      this.timeout = null;\n      if (this.lastEvent && !this.isOutsideOfText(this.lastEvent)) {\n        this.$gatherData(this.lastEvent, this.lastEvent.editor);\n      }\n    };\n    HoverTooltip.prototype.isOutsideOfText = function (e) {\n      var editor = e.editor;\n      var docPos = e.getDocumentPosition();\n      var line = editor.session.getLine(docPos.row);\n      if (docPos.column == line.length) {\n        var screenPos = editor.renderer.pixelToScreenCoordinates(\n          e.clientX,\n          e.clientY,\n        );\n        var clippedPos = editor.session.documentToScreenPosition(\n          docPos.row,\n          docPos.column,\n        );\n        if (\n          clippedPos.column != screenPos.column ||\n          clippedPos.row != screenPos.row\n        ) {\n          return true;\n        }\n      }\n      return false;\n    };\n    HoverTooltip.prototype.setDataProvider = function (value) {\n      this.$gatherData = value;\n    };\n    HoverTooltip.prototype.showForRange = function (\n      editor,\n      range,\n      domNode,\n      startingEvent,\n    ) {\n      var MARGIN = 10;\n      if (startingEvent && startingEvent != this.lastEvent) return;\n      if (this.isOpen && document.activeElement == this.getElement()) return;\n      var renderer = editor.renderer;\n      if (!this.isOpen) {\n        popupManager.addPopup(this);\n        this.$registerCloseEvents();\n        this.setTheme(renderer.theme);\n      }\n      this.isOpen = true;\n      this.addMarker(range, editor.session);\n      this.range = Range.fromPoints(range.start, range.end);\n      var position = renderer.textToScreenCoordinates(\n        range.start.row,\n        range.start.column,\n      );\n      var rect = renderer.scroller.getBoundingClientRect();\n      if (position.pageX < rect.left) position.pageX = rect.left;\n      var element = this.getElement();\n      element.innerHTML = \"\";\n      element.appendChild(domNode);\n      element.style.maxHeight = \"\";\n      element.style.display = \"block\";\n      var labelHeight = element.clientHeight;\n      var labelWidth = element.clientWidth;\n      var spaceBelow =\n        window.innerHeight - position.pageY - renderer.lineHeight;\n      var isAbove = true;\n      if (position.pageY - labelHeight < 0 && position.pageY < spaceBelow) {\n        isAbove = false;\n      }\n      element.style.maxHeight =\n        (isAbove ? position.pageY : spaceBelow) - MARGIN + \"px\";\n      element.style.top = isAbove\n        ? \"\"\n        : position.pageY + renderer.lineHeight + \"px\";\n      element.style.bottom = isAbove\n        ? window.innerHeight - position.pageY + \"px\"\n        : \"\";\n      element.style.left =\n        Math.min(position.pageX, window.innerWidth - labelWidth - MARGIN) +\n        \"px\";\n    };\n    HoverTooltip.prototype.addMarker = function (range, session) {\n      if (this.marker) {\n        this.$markerSession.removeMarker(this.marker);\n      }\n      this.$markerSession = session;\n      this.marker =\n        session && session.addMarker(range, \"ace_highlight-marker\", \"text\");\n    };\n    HoverTooltip.prototype.hide = function (e) {\n      if (!e && document.activeElement == this.getElement()) return;\n      if (\n        e &&\n        e.target &&\n        (e.type != \"keydown\" || e.ctrlKey || e.metaKey) &&\n        this.$element.contains(e.target)\n      )\n        return;\n      this.lastEvent = null;\n      if (this.timeout) clearTimeout(this.timeout);\n      this.timeout = null;\n      this.addMarker(null);\n      if (this.isOpen) {\n        this.$removeCloseEvents();\n        this.getElement().style.display = \"none\";\n        this.isOpen = false;\n        popupManager.removePopup(this);\n      }\n    };\n    HoverTooltip.prototype.$registerCloseEvents = function () {\n      window.addEventListener(\"keydown\", this.hide, true);\n      window.addEventListener(\"wheel\", this.hide, true);\n      window.addEventListener(\"mousedown\", this.hide, true);\n    };\n    HoverTooltip.prototype.$removeCloseEvents = function () {\n      window.removeEventListener(\"keydown\", this.hide, true);\n      window.removeEventListener(\"wheel\", this.hide, true);\n      window.removeEventListener(\"mousedown\", this.hide, true);\n    };\n    HoverTooltip.prototype.onMouseOut = function (e) {\n      if (this.timeout) {\n        clearTimeout(this.timeout);\n        this.timeout = null;\n      }\n      this.lastEvent = null;\n      if (!this.isOpen) return;\n      if (!e.relatedTarget || this.getElement().contains(e.relatedTarget))\n        return;\n      if (e && e.currentTarget.contains(e.relatedTarget)) return;\n      if (!e.relatedTarget.classList.contains(\"ace_content\")) this.hide();\n    };\n    return HoverTooltip;\n  })(Tooltip);\n  exports.HoverTooltip = HoverTooltip;\n});\n\ndefine(\"ace/mouse/default_gutter_handler\", [\n  \"require\",\n  \"exports\",\n  \"module\",\n  \"ace/lib/dom\",\n  \"ace/lib/event\",\n  \"ace/tooltip\",\n  \"ace/config\",\n], function (require, exports, module) {\n  \"use strict\";\n  var __extends =\n    (this && this.__extends) ||\n    (function () {\n      var extendStatics = function (d, b) {\n        extendStatics =\n          Object.setPrototypeOf ||\n          ({ __proto__: [] } instanceof Array &&\n            function (d, b) {\n              d.__proto__ = b;\n            }) ||\n          function (d, b) {\n            for (var p in b)\n              if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p];\n          };\n        return extendStatics(d, b);\n      };\n      return function (d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\n            \"Class extends value \" +\n              String(b) +\n              \" is not a constructor or null\",\n          );\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype =\n          b === null\n            ? Object.create(b)\n            : ((__.prototype = b.prototype), new __());\n      };\n    })();\n  var __values =\n    (this && this.__values) ||\n    function (o) {\n      var s = typeof Symbol === \"function\" && Symbol.iterator,\n        m = s && o[s],\n        i = 0;\n      if (m) return m.call(o);\n      if (o && typeof o.length === \"number\")\n        return {\n          next: function () {\n            if (o && i >= o.length) o = void 0;\n            return { value: o && o[i++], done: !o };\n          },\n        };\n      throw new TypeError(\n        s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\",\n      );\n    };\n  var dom = require(\"../lib/dom\");\n  var event = require(\"../lib/event\");\n  var Tooltip = require(\"../tooltip\").Tooltip;\n  var nls = require(\"../config\").nls;\n  function GutterHandler(mouseHandler) {\n    var editor = mouseHandler.editor;\n    var gutter = editor.renderer.$gutterLayer;\n    var tooltip = new GutterTooltip(editor);\n    mouseHandler.editor.setDefaultHandler(\"guttermousedown\", function (e) {\n      if (!editor.isFocused() || e.getButton() != 0) return;\n      var gutterRegion = gutter.getRegion(e);\n      if (gutterRegion == \"foldWidgets\") return;\n      var row = e.getDocumentPosition().row;\n      var selection = editor.session.selection;\n      if (e.getShiftKey()) selection.selectTo(row, 0);\n      else {\n        if (e.domEvent.detail == 2) {\n          editor.selectAll();\n          return e.preventDefault();\n        }\n        mouseHandler.$clickSelection = editor.selection.getLineRange(row);\n      }\n      mouseHandler.setState(\"selectByLines\");\n      mouseHandler.captureMouse(e);\n      return e.preventDefault();\n    });\n    var tooltipTimeout, mouseEvent;\n    function showTooltip() {\n      var row = mouseEvent.getDocumentPosition().row;\n      var maxRow = editor.session.getLength();\n      if (row == maxRow) {\n        var screenRow = editor.renderer.pixelToScreenCoordinates(\n          0,\n          mouseEvent.y,\n        ).row;\n        var pos = mouseEvent.$pos;\n        if (screenRow > editor.session.documentToScreenRow(pos.row, pos.column))\n          return hideTooltip();\n      }\n      tooltip.showTooltip(row);\n      if (!tooltip.isOpen) return;\n      editor.on(\"mousewheel\", hideTooltip);\n      if (mouseHandler.$tooltipFollowsMouse) {\n        moveTooltip(mouseEvent);\n      } else {\n        var gutterRow = mouseEvent.getGutterRow();\n        var gutterCell = gutter.$lines.get(gutterRow);\n        if (gutterCell) {\n          var gutterElement = gutterCell.element.querySelector(\n            \".ace_gutter_annotation\",\n          );\n          var rect = gutterElement.getBoundingClientRect();\n          var style = tooltip.getElement().style;\n          style.left = rect.right + \"px\";\n          style.top = rect.bottom + \"px\";\n        } else {\n          moveTooltip(mouseEvent);\n        }\n      }\n    }\n    function hideTooltip() {\n      if (tooltipTimeout) tooltipTimeout = clearTimeout(tooltipTimeout);\n      if (tooltip.isOpen) {\n        tooltip.hideTooltip();\n        editor.off(\"mousewheel\", hideTooltip);\n      }\n    }\n    function moveTooltip(e) {\n      tooltip.setPosition(e.x, e.y);\n    }\n    mouseHandler.editor.setDefaultHandler(\"guttermousemove\", function (e) {\n      var target = e.domEvent.target || e.domEvent.srcElement;\n      if (dom.hasCssClass(target, \"ace_fold-widget\")) return hideTooltip();\n      if (tooltip.isOpen && mouseHandler.$tooltipFollowsMouse) moveTooltip(e);\n      mouseEvent = e;\n      if (tooltipTimeout) return;\n      tooltipTimeout = setTimeout(function () {\n        tooltipTimeout = null;\n        if (mouseEvent && !mouseHandler.isMousePressed) showTooltip();\n        else hideTooltip();\n      }, 50);\n    });\n    event.addListener(\n      editor.renderer.$gutter,\n      \"mouseout\",\n      function (e) {\n        mouseEvent = null;\n        if (!tooltip.isOpen || tooltipTimeout) return;\n        tooltipTimeout = setTimeout(function () {\n          tooltipTimeout = null;\n          hideTooltip();\n        }, 50);\n      },\n      editor,\n    );\n    editor.on(\"changeSession\", hideTooltip);\n    editor.on(\"input\", hideTooltip);\n  }\n  exports.GutterHandler = GutterHandler;\n  var GutterTooltip = /** @class */ (function (_super) {\n    __extends(GutterTooltip, _super);\n    function GutterTooltip(editor) {\n      var _this = _super.call(this, editor.container) || this;\n      _this.editor = editor;\n      return _this;\n    }\n    GutterTooltip.prototype.setPosition = function (x, y) {\n      var windowWidth =\n        window.innerWidth || document.documentElement.clientWidth;\n      var windowHeight =\n        window.innerHeight || document.documentElement.clientHeight;\n      var width = this.getWidth();\n      var height = this.getHeight();\n      x += 15;\n      y += 15;\n      if (x + width > windowWidth) {\n        x -= x + width - windowWidth;\n      }\n      if (y + height > windowHeight) {\n        y -= 20 + height;\n      }\n      Tooltip.prototype.setPosition.call(this, x, y);\n    };\n    Object.defineProperty(GutterTooltip, \"annotationLabels\", {\n      get: function () {\n        return {\n          error: { singular: nls(\"error\"), plural: nls(\"errors\") },\n          warning: { singular: nls(\"warning\"), plural: nls(\"warnings\") },\n          info: {\n            singular: nls(\"information message\"),\n            plural: nls(\"information messages\"),\n          },\n        };\n      },\n      enumerable: false,\n      configurable: true,\n    });\n    GutterTooltip.prototype.showTooltip = function (row) {\n      var gutter = this.editor.renderer.$gutterLayer;\n      var annotationsInRow = gutter.$annotations[row];\n      var annotation;\n      if (annotationsInRow)\n        annotation = {\n          text: Array.from(annotationsInRow.text),\n          type: Array.from(annotationsInRow.type),\n        };\n      else annotation = { text: [], type: [] };\n      var fold = gutter.session.getFoldLine(row);\n      if (fold && gutter.$showFoldedAnnotations) {\n        var annotationsInFold = { error: [], warning: [], info: [] };\n        var mostSevereAnnotationInFoldType;\n        for (var i = row + 1; i <= fold.end.row; i++) {\n          if (!gutter.$annotations[i]) continue;\n          for (var j = 0; j < gutter.$annotations[i].text.length; j++) {\n            var annotationType = gutter.$annotations[i].type[j];\n            annotationsInFold[annotationType].push(\n              gutter.$annotations[i].text[j],\n            );\n            if (annotationType === \"error\") {\n              mostSevereAnnotationInFoldType = \"error_fold\";\n              continue;\n            }\n            if (annotationType === \"warning\") {\n              mostSevereAnnotationInFoldType = \"warning_fold\";\n              continue;\n            }\n          }\n        }\n        if (\n          mostSevereAnnotationInFoldType === \"error_fold\" ||\n          mostSevereAnnotationInFoldType === \"warning_fold\"\n        ) {\n          var summaryFoldedAnnotations = \"\".concat(\n            GutterTooltip.annotationsToSummaryString(annotationsInFold),\n            \" in folded code.\",\n          );\n          annotation.text.push(summaryFoldedAnnotations);\n          annotation.type.push(mostSevereAnnotationInFoldType);\n        }\n      }\n      if (annotation.text.length === 0) return this.hide();\n      var annotationMessages = { error: [], warning: [], info: [] };\n      var iconClassName = gutter.$useSvgGutterIcons\n        ? \"ace_icon_svg\"\n        : \"ace_icon\";\n      for (var i = 0; i < annotation.text.length; i++) {\n        var line = \"<span class='ace_\"\n          .concat(annotation.type[i], \" \")\n          .concat(iconClassName, \"' aria-label='\")\n          .concat(\n            GutterTooltip.annotationLabels[\n              annotation.type[i].replace(\"_fold\", \"\")\n            ].singular,\n            \"' role=img> </span> \",\n          )\n          .concat(annotation.text[i]);\n        annotationMessages[annotation.type[i].replace(\"_fold\", \"\")].push(line);\n      }\n      var tooltipContent = []\n        .concat(\n          annotationMessages.error,\n          annotationMessages.warning,\n          annotationMessages.info,\n        )\n        .join(\"<br>\");\n      this.setHtml(tooltipContent);\n      this.$element.setAttribute(\"aria-live\", \"polite\");\n      if (!this.isOpen) {\n        this.setTheme(this.editor.renderer.theme);\n        this.setClassName(\"ace_gutter-tooltip\");\n      }\n      this.show();\n      this.editor._signal(\"showGutterTooltip\", this);\n    };\n    GutterTooltip.prototype.hideTooltip = function () {\n      this.$element.removeAttribute(\"aria-live\");\n      this.hide();\n      this.editor._signal(\"hideGutterTooltip\", this);\n    };\n    GutterTooltip.annotationsToSummaryString = function (annotations) {\n      var e_1, _a;\n      var summary = [];\n      var annotationTypes = [\"error\", \"warning\", \"info\"];\n      try {\n        for (\n          var annotationTypes_1 = __values(annotationTypes),\n            annotationTypes_1_1 = annotationTypes_1.next();\n          !annotationTypes_1_1.done;\n          annotationTypes_1_1 = annotationTypes_1.next()\n        ) {\n          var annotationType = annotationTypes_1_1.value;\n          if (!annotations[annotationType].length) continue;\n          var label =\n            annotations[annotationType].length === 1\n              ? GutterTooltip.annotationLabels[annotationType].singular\n              : GutterTooltip.annotationLabels[annotationType].plural;\n          summary.push(\n            \"\".concat(annotations[annotationType].length, \" \").concat(label),\n          );\n        }\n      } catch (e_1_1) {\n        e_1 = { error: e_1_1 };\n      } finally {\n        try {\n          if (\n            annotationTypes_1_1 &&\n            !annotationTypes_1_1.done &&\n            (_a = annotationTypes_1.return)\n          )\n            _a.call(annotationTypes_1);\n        } finally {\n          if (e_1) throw e_1.error;\n        }\n      }\n      return summary.join(\", \");\n    };\n    return GutterTooltip;\n  })(Tooltip);\n  exports.GutterTooltip = GutterTooltip;\n});\n\ndefine(\"ace/mouse/mouse_event\", [\n  \"require\",\n  \"exports\",\n  \"module\",\n  \"ace/lib/event\",\n  \"ace/lib/useragent\",\n], function (require, exports, module) {\n  \"use strict\";\n  var event = require(\"../lib/event\");\n  var useragent = require(\"../lib/useragent\");\n  var MouseEvent = /** @class */ (function () {\n    function MouseEvent(domEvent, editor) {\n      this.speed;\n      this.wheelX;\n      this.wheelY;\n      this.domEvent = domEvent;\n      this.editor = editor;\n      this.x = this.clientX = domEvent.clientX;\n      this.y = this.clientY = domEvent.clientY;\n      this.$pos = null;\n      this.$inSelection = null;\n      this.propagationStopped = false;\n      this.defaultPrevented = false;\n    }\n    MouseEvent.prototype.stopPropagation = function () {\n      event.stopPropagation(this.domEvent);\n      this.propagationStopped = true;\n    };\n    MouseEvent.prototype.preventDefault = function () {\n      event.preventDefault(this.domEvent);\n      this.defaultPrevented = true;\n    };\n    MouseEvent.prototype.stop = function () {\n      this.stopPropagation();\n      this.preventDefault();\n    };\n    MouseEvent.prototype.getDocumentPosition = function () {\n      if (this.$pos) return this.$pos;\n      this.$pos = this.editor.renderer.screenToTextCoordinates(\n        this.clientX,\n        this.clientY,\n      );\n      return this.$pos;\n    };\n    MouseEvent.prototype.getGutterRow = function () {\n      var documentRow = this.getDocumentPosition().row;\n      var screenRow = this.editor.session.documentToScreenRow(documentRow, 0);\n      var screenTopRow = this.editor.session.documentToScreenRow(\n        this.editor.renderer.$gutterLayer.$lines.get(0).row,\n        0,\n      );\n      return screenRow - screenTopRow;\n    };\n    MouseEvent.prototype.inSelection = function () {\n      if (this.$inSelection !== null) return this.$inSelection;\n      var editor = this.editor;\n      var selectionRange = editor.getSelectionRange();\n      if (selectionRange.isEmpty()) this.$inSelection = false;\n      else {\n        var pos = this.getDocumentPosition();\n        this.$inSelection = selectionRange.contains(pos.row, pos.column);\n      }\n      return this.$inSelection;\n    };\n    MouseEvent.prototype.getButton = function () {\n      return event.getButton(this.domEvent);\n    };\n    MouseEvent.prototype.getShiftKey = function () {\n      return this.domEvent.shiftKey;\n    };\n    MouseEvent.prototype.getAccelKey = function () {\n      return useragent.isMac ? this.domEvent.metaKey : this.domEvent.ctrlKey;\n    };\n    return MouseEvent;\n  })();\n  exports.MouseEvent = MouseEvent;\n});\n\ndefine(\"ace/mouse/dragdrop_handler\", [\n  \"require\",\n  \"exports\",\n  \"module\",\n  \"ace/lib/dom\",\n  \"ace/lib/event\",\n  \"ace/lib/useragent\",\n], function (require, exports, module) {\n  \"use strict\";\n  var dom = require(\"../lib/dom\");\n  var event = require(\"../lib/event\");\n  var useragent = require(\"../lib/useragent\");\n  var AUTOSCROLL_DELAY = 200;\n  var SCROLL_CURSOR_DELAY = 200;\n  var SCROLL_CURSOR_HYSTERESIS = 5;\n  function DragdropHandler(mouseHandler) {\n    var editor = mouseHandler.editor;\n    var dragImage = dom.createElement(\"div\");\n    dragImage.style.cssText =\n      \"top:-100px;position:absolute;z-index:2147483647;opacity:0.5\";\n    dragImage.textContent = \"\\xa0\";\n    var exports = [\n      \"dragWait\",\n      \"dragWaitEnd\",\n      \"startDrag\",\n      \"dragReadyEnd\",\n      \"onMouseDrag\",\n    ];\n    exports.forEach(function (x) {\n      mouseHandler[x] = this[x];\n    }, this);\n    editor.on(\"mousedown\", this.onMouseDown.bind(mouseHandler));\n    var mouseTarget = editor.container;\n    var dragSelectionMarker, x, y;\n    var timerId, range;\n    var dragCursor,\n      counter = 0;\n    var dragOperation;\n    var isInternal;\n    var autoScrollStartTime;\n    var cursorMovedTime;\n    var cursorPointOnCaretMoved;\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      var dataTransfer = e.dataTransfer;\n      dataTransfer.effectAllowed = editor.getReadOnly() ? \"copy\" : \"copyMove\";\n      editor.container.appendChild(dragImage);\n      dataTransfer.setDragImage && dataTransfer.setDragImage(dragImage, 0, 0);\n      setTimeout(function () {\n        editor.container.removeChild(dragImage);\n      });\n      dataTransfer.clearData();\n      dataTransfer.setData(\"Text\", editor.session.getTextRange());\n      isInternal = true;\n      this.setState(\"drag\");\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.$resetCursorStyle();\n      }\n      this.editor.unsetStyle(\"ace_dragging\");\n      this.editor.renderer.setCursorStyle(\"\");\n    };\n    this.onDragEnter = function (e) {\n      if (editor.getReadOnly() || !canAccept(e.dataTransfer)) return;\n      x = e.clientX;\n      y = e.clientY;\n      if (!dragSelectionMarker) addDragMarker();\n      counter++;\n      e.dataTransfer.dropEffect = dragOperation = getDropEffect(e);\n      return event.preventDefault(e);\n    };\n    this.onDragOver = function (e) {\n      if (editor.getReadOnly() || !canAccept(e.dataTransfer)) return;\n      x = e.clientX;\n      y = e.clientY;\n      if (!dragSelectionMarker) {\n        addDragMarker();\n        counter++;\n      }\n      if (onMouseMoveTimer !== null) onMouseMoveTimer = null;\n      e.dataTransfer.dropEffect = dragOperation = getDropEffect(e);\n      return event.preventDefault(e);\n    };\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    this.onDrop = function (e) {\n      if (!dragCursor) return;\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      return event.preventDefault(e);\n    };\n    event.addListener(\n      mouseTarget,\n      \"dragstart\",\n      this.onDragStart.bind(mouseHandler),\n      editor,\n    );\n    event.addListener(\n      mouseTarget,\n      \"dragend\",\n      this.onDragEnd.bind(mouseHandler),\n      editor,\n    );\n    event.addListener(\n      mouseTarget,\n      \"dragenter\",\n      this.onDragEnter.bind(mouseHandler),\n      editor,\n    );\n    event.addListener(\n      mouseTarget,\n      \"dragover\",\n      this.onDragOver.bind(mouseHandler),\n      editor,\n    );\n    event.addListener(\n      mouseTarget,\n      \"dragleave\",\n      this.onDragLeave.bind(mouseHandler),\n      editor,\n    );\n    event.addListener(\n      mouseTarget,\n      \"drop\",\n      this.onDrop.bind(mouseHandler),\n      editor,\n    );\n    function scrollCursorIntoView(cursor, prevCursor) {\n      var now = Date.now();\n      var vMovement = !prevCursor || cursor.row != prevCursor.row;\n      var hMovement = !prevCursor || cursor.column != prevCursor.column;\n      if (!cursorMovedTime || vMovement || hMovement) {\n        editor.moveCursorToPosition(cursor);\n        cursorMovedTime = now;\n        cursorPointOnCaretMoved = { x: x, y: y };\n      } else {\n        var distance = calcDistance(\n          cursorPointOnCaretMoved.x,\n          cursorPointOnCaretMoved.y,\n          x,\n          y,\n        );\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    function autoScroll(cursor, prevCursor) {\n      var now = Date.now();\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) autoScrollStartTime = now;\n        else if (now - autoScrollStartTime >= AUTOSCROLL_DELAY)\n          editor.renderer.scrollCursorIntoView(scrollCursor);\n      } else {\n        autoScrollStartTime = null;\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    function addDragMarker() {\n      range = editor.selection.toOrientedRange();\n      dragSelectionMarker = editor.session.addMarker(\n        range,\n        \"ace_selection\",\n        editor.getSelectionStyle(),\n      );\n      editor.clearSelection();\n      if (editor.isFocused()) editor.renderer.$cursorLayer.setBlinking(false);\n      clearInterval(timerId);\n      onDragInterval();\n      timerId = setInterval(onDragInterval, 20);\n      counter = 0;\n      event.addListener(document, \"mousemove\", onMouseMove);\n    }\n    function clearDragMarker() {\n      clearInterval(timerId);\n      editor.session.removeMarker(dragSelectionMarker);\n      dragSelectionMarker = null;\n      editor.selection.fromOrientedRange(range);\n      if (editor.isFocused() && !isInternal) editor.$resetCursorStyle();\n      range = null;\n      dragCursor = null;\n      counter = 0;\n      autoScrollStartTime = null;\n      cursorMovedTime = null;\n      event.removeListener(document, \"mousemove\", onMouseMove);\n    }\n    var onMouseMoveTimer = null;\n    function onMouseMove() {\n      if (onMouseMoveTimer == null) {\n        onMouseMoveTimer = setTimeout(function () {\n          if (onMouseMoveTimer != null && dragSelectionMarker)\n            clearDragMarker();\n        }, 20);\n      }\n    }\n    function canAccept(dataTransfer) {\n      var types = dataTransfer.types;\n      return (\n        !types ||\n        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 = [\n        \"move\",\n        \"copymove\",\n        \"linkmove\",\n        \"all\",\n        \"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      if (copyModifierState && copyAllowed.indexOf(effectAllowed) >= 0)\n        dropEffect = \"copy\";\n      else if (moveAllowed.indexOf(effectAllowed) >= 0) dropEffect = \"move\";\n      else if (copyAllowed.indexOf(effectAllowed) >= 0) dropEffect = \"copy\";\n      return dropEffect;\n    }\n  }\n  (function () {\n    this.dragWait = function () {\n      var interval = Date.now() - this.mousedownEvent.time;\n      if (interval > this.editor.getDragDelay()) this.startDrag();\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    this.dragReadyEnd = function (e) {\n      this.editor.$resetCursorStyle();\n      this.editor.unsetStyle(\"ace_dragging\");\n      this.editor.renderer.setCursorStyle(\"\");\n      this.dragWaitEnd();\n    };\n    this.startDrag = function () {\n      this.cancelDrag = false;\n      var editor = this.editor;\n      var target = editor.container;\n      target.draggable = true;\n      editor.renderer.$cursorLayer.setBlinking(false);\n      editor.setStyle(\"ace_dragging\");\n      var cursorStyle = useragent.isWin ? \"default\" : \"move\";\n      editor.renderer.setCursorStyle(cursorStyle);\n      this.setState(\"dragReady\");\n    };\n    this.onMouseDrag = function (e) {\n      var target = this.editor.container;\n      if (useragent.isIE && this.state == \"dragReady\") {\n        var distance = calcDistance(\n          this.mousedownEvent.x,\n          this.mousedownEvent.y,\n          this.x,\n          this.y,\n        );\n        if (distance > 3) target.dragDrop();\n      }\n      if (this.state === \"dragWait\") {\n        var distance = calcDistance(\n          this.mousedownEvent.x,\n          this.mousedownEvent.y,\n          this.x,\n          this.y,\n        );\n        if (distance > 0) {\n          target.draggable = false;\n          this.startSelect(this.mousedownEvent.getDocumentPosition());\n        }\n      }\n    };\n    this.onMouseDown = function (e) {\n      if (!this.$dragEnabled) return;\n      this.mousedownEvent = e;\n      var editor = this.editor;\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        if (e.editor.inMultiSelectMode && (e.getAccelKey() || e.getShiftKey()))\n          return;\n        this.mousedownEvent.time = Date.now();\n        var eventTarget = e.domEvent.target || e.domEvent.srcElement;\n        if (\"unselectable\" in eventTarget) eventTarget.unselectable = \"on\";\n        if (editor.getDragDelay()) {\n          if (useragent.isWebKit) {\n            this.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  }).call(DragdropHandler.prototype);\n  function calcDistance(ax, ay, bx, by) {\n    return Math.sqrt(Math.pow(bx - ax, 2) + Math.pow(by - ay, 2));\n  }\n  exports.DragdropHandler = DragdropHandler;\n});\n\ndefine(\"ace/mouse/touch_handler\", [\n  \"require\",\n  \"exports\",\n  \"module\",\n  \"ace/mouse/mouse_event\",\n  \"ace/lib/event\",\n  \"ace/lib/dom\",\n], function (require, exports, module) {\n  \"use strict\";\n  var MouseEvent = require(\"./mouse_event\").MouseEvent;\n  var event = require(\"../lib/event\");\n  var dom = require(\"../lib/dom\");\n  exports.addTouchListeners = function (el, editor) {\n    var mode = \"scroll\";\n    var startX;\n    var startY;\n    var touchStartT;\n    var lastT;\n    var longTouchTimer;\n    var animationTimer;\n    var animationSteps = 0;\n    var pos;\n    var clickCount = 0;\n    var vX = 0;\n    var vY = 0;\n    var pressed;\n    var contextMenu;\n    function createContextMenu() {\n      var clipboard = window.navigator && window.navigator.clipboard;\n      var isOpen = false;\n      var updateMenu = function () {\n        var selected = editor.getCopyText();\n        var hasUndo = editor.session.getUndoManager().hasUndo();\n        contextMenu.replaceChild(\n          dom.buildDom(\n            isOpen\n              ? [\n                  \"span\",\n                  !selected && [\n                    \"span\",\n                    { class: \"ace_mobile-button\", action: \"selectall\" },\n                    \"Select All\",\n                  ],\n                  selected && [\n                    \"span\",\n                    { class: \"ace_mobile-button\", action: \"copy\" },\n                    \"Copy\",\n                  ],\n                  selected && [\n                    \"span\",\n                    { class: \"ace_mobile-button\", action: \"cut\" },\n                    \"Cut\",\n                  ],\n                  clipboard && [\n                    \"span\",\n                    { class: \"ace_mobile-button\", action: \"paste\" },\n                    \"Paste\",\n                  ],\n                  hasUndo && [\n                    \"span\",\n                    { class: \"ace_mobile-button\", action: \"undo\" },\n                    \"Undo\",\n                  ],\n                  [\n                    \"span\",\n                    { class: \"ace_mobile-button\", action: \"find\" },\n                    \"Find\",\n                  ],\n                  [\n                    \"span\",\n                    {\n                      class: \"ace_mobile-button\",\n                      action: \"openCommandPalette\",\n                    },\n                    \"Palette\",\n                  ],\n                ]\n              : [\"span\"],\n          ),\n          contextMenu.firstChild,\n        );\n      };\n      var handleClick = function (e) {\n        var action = e.target.getAttribute(\"action\");\n        if (action == \"more\" || !isOpen) {\n          isOpen = !isOpen;\n          return updateMenu();\n        }\n        if (action == \"paste\") {\n          clipboard.readText().then(function (text) {\n            editor.execCommand(action, text);\n          });\n        } else if (action) {\n          if (action == \"cut\" || action == \"copy\") {\n            if (clipboard) clipboard.writeText(editor.getCopyText());\n            else document.execCommand(\"copy\");\n          }\n          editor.execCommand(action);\n        }\n        contextMenu.firstChild.style.display = \"none\";\n        isOpen = false;\n        if (action != \"openCommandPalette\") editor.focus();\n      };\n      contextMenu = dom.buildDom(\n        [\n          \"div\",\n          {\n            class: \"ace_mobile-menu\",\n            ontouchstart: function (e) {\n              mode = \"menu\";\n              e.stopPropagation();\n              e.preventDefault();\n              editor.textInput.focus();\n            },\n            ontouchend: function (e) {\n              e.stopPropagation();\n              e.preventDefault();\n              handleClick(e);\n            },\n            onclick: handleClick,\n          },\n          [\"span\"],\n          [\"span\", { class: \"ace_mobile-button\", action: \"more\" }, \"...\"],\n        ],\n        editor.container,\n      );\n    }\n    function showContextMenu() {\n      if (!contextMenu) createContextMenu();\n      var cursor = editor.selection.cursor;\n      var pagePos = editor.renderer.textToScreenCoordinates(\n        cursor.row,\n        cursor.column,\n      );\n      var leftOffset = editor.renderer.textToScreenCoordinates(0, 0).pageX;\n      var scrollLeft = editor.renderer.scrollLeft;\n      var rect = editor.container.getBoundingClientRect();\n      contextMenu.style.top = pagePos.pageY - rect.top - 3 + \"px\";\n      if (pagePos.pageX - rect.left < rect.width - 70) {\n        contextMenu.style.left = \"\";\n        contextMenu.style.right = \"10px\";\n      } else {\n        contextMenu.style.right = \"\";\n        contextMenu.style.left = leftOffset + scrollLeft - rect.left + \"px\";\n      }\n      contextMenu.style.display = \"\";\n      contextMenu.firstChild.style.display = \"none\";\n      editor.on(\"input\", hideContextMenu);\n    }\n    function hideContextMenu(e) {\n      if (contextMenu) contextMenu.style.display = \"none\";\n      editor.off(\"input\", hideContextMenu);\n    }\n    function handleLongTap() {\n      longTouchTimer = null;\n      clearTimeout(longTouchTimer);\n      var range = editor.selection.getRange();\n      var inSelection = range.contains(pos.row, pos.column);\n      if (range.isEmpty() || !inSelection) {\n        editor.selection.moveToPosition(pos);\n        editor.selection.selectWord();\n      }\n      mode = \"wait\";\n      showContextMenu();\n    }\n    function switchToSelectionMode() {\n      longTouchTimer = null;\n      clearTimeout(longTouchTimer);\n      editor.selection.moveToPosition(pos);\n      var range =\n        clickCount >= 2\n          ? editor.selection.getLineRange(pos.row)\n          : editor.session.getBracketRange(pos);\n      if (range && !range.isEmpty()) {\n        editor.selection.setRange(range);\n      } else {\n        editor.selection.selectWord();\n      }\n      mode = \"wait\";\n    }\n    event.addListener(\n      el,\n      \"contextmenu\",\n      function (e) {\n        if (!pressed) return;\n        var textarea = editor.textInput.getElement();\n        textarea.focus();\n      },\n      editor,\n    );\n    event.addListener(\n      el,\n      \"touchstart\",\n      function (e) {\n        var touches = e.touches;\n        if (longTouchTimer || touches.length > 1) {\n          clearTimeout(longTouchTimer);\n          longTouchTimer = null;\n          touchStartT = -1;\n          mode = \"zoom\";\n          return;\n        }\n        pressed = editor.$mouseHandler.isMousePressed = true;\n        var h = editor.renderer.layerConfig.lineHeight;\n        var w = editor.renderer.layerConfig.lineHeight;\n        var t = e.timeStamp;\n        lastT = t;\n        var touchObj = touches[0];\n        var x = touchObj.clientX;\n        var y = touchObj.clientY;\n        if (Math.abs(startX - x) + Math.abs(startY - y) > h) touchStartT = -1;\n        startX = e.clientX = x;\n        startY = e.clientY = y;\n        vX = vY = 0;\n        var ev = new MouseEvent(e, editor);\n        pos = ev.getDocumentPosition();\n        if (t - touchStartT < 500 && touches.length == 1 && !animationSteps) {\n          clickCount++;\n          e.preventDefault();\n          e.button = 0;\n          switchToSelectionMode();\n        } else {\n          clickCount = 0;\n          var cursor = editor.selection.cursor;\n          var anchor = editor.selection.isEmpty()\n            ? cursor\n            : editor.selection.anchor;\n          var cursorPos = editor.renderer.$cursorLayer.getPixelPosition(\n            cursor,\n            true,\n          );\n          var anchorPos = editor.renderer.$cursorLayer.getPixelPosition(\n            anchor,\n            true,\n          );\n          var rect = editor.renderer.scroller.getBoundingClientRect();\n          var offsetTop = editor.renderer.layerConfig.offset;\n          var offsetLeft = editor.renderer.scrollLeft;\n          var weightedDistance = function (x, y) {\n            x = x / w;\n            y = y / h - 0.75;\n            return x * x + y * y;\n          };\n          if (e.clientX < rect.left) {\n            mode = \"zoom\";\n            return;\n          }\n          var diff1 = weightedDistance(\n            e.clientX - rect.left - cursorPos.left + offsetLeft,\n            e.clientY - rect.top - cursorPos.top + offsetTop,\n          );\n          var diff2 = weightedDistance(\n            e.clientX - rect.left - anchorPos.left + offsetLeft,\n            e.clientY - rect.top - anchorPos.top + offsetTop,\n          );\n          if (diff1 < 3.5 && diff2 < 3.5)\n            mode = diff1 > diff2 ? \"cursor\" : \"anchor\";\n          if (diff2 < 3.5) mode = \"anchor\";\n          else if (diff1 < 3.5) mode = \"cursor\";\n          else mode = \"scroll\";\n          longTouchTimer = setTimeout(handleLongTap, 450);\n        }\n        touchStartT = t;\n      },\n      editor,\n    );\n    event.addListener(\n      el,\n      \"touchend\",\n      function (e) {\n        pressed = editor.$mouseHandler.isMousePressed = false;\n        if (animationTimer) clearInterval(animationTimer);\n        if (mode == \"zoom\") {\n          mode = \"\";\n          animationSteps = 0;\n        } else if (longTouchTimer) {\n          editor.selection.moveToPosition(pos);\n          animationSteps = 0;\n          showContextMenu();\n        } else if (mode == \"scroll\") {\n          animate();\n          hideContextMenu();\n        } else {\n          showContextMenu();\n        }\n        clearTimeout(longTouchTimer);\n        longTouchTimer = null;\n      },\n      editor,\n    );\n    event.addListener(\n      el,\n      \"touchmove\",\n      function (e) {\n        if (longTouchTimer) {\n          clearTimeout(longTouchTimer);\n          longTouchTimer = null;\n        }\n        var touches = e.touches;\n        if (touches.length > 1 || mode == \"zoom\") return;\n        var touchObj = touches[0];\n        var wheelX = startX - touchObj.clientX;\n        var wheelY = startY - touchObj.clientY;\n        if (mode == \"wait\") {\n          if (wheelX * wheelX + wheelY * wheelY > 4) mode = \"cursor\";\n          else return e.preventDefault();\n        }\n        startX = touchObj.clientX;\n        startY = touchObj.clientY;\n        e.clientX = touchObj.clientX;\n        e.clientY = touchObj.clientY;\n        var t = e.timeStamp;\n        var dt = t - lastT;\n        lastT = t;\n        if (mode == \"scroll\") {\n          var mouseEvent = new MouseEvent(e, editor);\n          mouseEvent.speed = 1;\n          mouseEvent.wheelX = wheelX;\n          mouseEvent.wheelY = wheelY;\n          if (10 * Math.abs(wheelX) < Math.abs(wheelY)) wheelX = 0;\n          if (10 * Math.abs(wheelY) < Math.abs(wheelX)) wheelY = 0;\n          if (dt != 0) {\n            vX = wheelX / dt;\n            vY = wheelY / dt;\n          }\n          editor._emit(\"mousewheel\", mouseEvent);\n          if (!mouseEvent.propagationStopped) {\n            vX = vY = 0;\n          }\n        } else {\n          var ev = new MouseEvent(e, editor);\n          var pos = ev.getDocumentPosition();\n          if (mode == \"cursor\") editor.selection.moveCursorToPosition(pos);\n          else if (mode == \"anchor\")\n            editor.selection.setSelectionAnchor(pos.row, pos.column);\n          editor.renderer.scrollCursorIntoView(pos);\n          e.preventDefault();\n        }\n      },\n      editor,\n    );\n    function animate() {\n      animationSteps += 60;\n      animationTimer = setInterval(function () {\n        if (animationSteps-- <= 0) {\n          clearInterval(animationTimer);\n          animationTimer = null;\n        }\n        if (Math.abs(vX) < 0.01) vX = 0;\n        if (Math.abs(vY) < 0.01) vY = 0;\n        if (animationSteps < 20) vX = 0.9 * vX;\n        if (animationSteps < 20) vY = 0.9 * vY;\n        var oldScrollTop = editor.session.getScrollTop();\n        editor.renderer.scrollBy(10 * vX, 10 * vY);\n        if (oldScrollTop == editor.session.getScrollTop()) animationSteps = 0;\n      }, 10);\n    }\n  };\n});\n\ndefine(\"ace/mouse/mouse_handler\", [\n  \"require\",\n  \"exports\",\n  \"module\",\n  \"ace/lib/event\",\n  \"ace/lib/useragent\",\n  \"ace/mouse/default_handlers\",\n  \"ace/mouse/default_gutter_handler\",\n  \"ace/mouse/mouse_event\",\n  \"ace/mouse/dragdrop_handler\",\n  \"ace/mouse/touch_handler\",\n  \"ace/config\",\n], function (require, exports, module) {\n  \"use strict\";\n  var event = require(\"../lib/event\");\n  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_handler\").DragdropHandler;\n  var addTouchListeners = require(\"./touch_handler\").addTouchListeners;\n  var config = require(\"../config\");\n  var MouseHandler = /** @class */ (function () {\n    function MouseHandler(editor) {\n      this.$dragDelay;\n      this.$dragEnabled;\n      this.$mouseMoved;\n      this.mouseEvent;\n      this.$focusTimeout;\n      var _self = this;\n      this.editor = editor;\n      new DefaultHandlers(this);\n      new DefaultGutterHandler(this);\n      new DragdropHandler(this);\n      var focusEditor = function (e) {\n        var windowBlurred =\n          !document.hasFocus ||\n          !document.hasFocus() ||\n          (!editor.isFocused() &&\n            document.activeElement ==\n              (editor.textInput && editor.textInput.getElement()));\n        if (windowBlurred) window.focus();\n        editor.focus();\n        setTimeout(function () {\n          if (!editor.isFocused()) editor.focus();\n        });\n      };\n      var mouseTarget = editor.renderer.getMouseEventTarget();\n      event.addListener(\n        mouseTarget,\n        \"click\",\n        this.onMouseEvent.bind(this, \"click\"),\n        editor,\n      );\n      event.addListener(\n        mouseTarget,\n        \"mousemove\",\n        this.onMouseMove.bind(this, \"mousemove\"),\n        editor,\n      );\n      event.addMultiMouseDownListener(\n        [\n          mouseTarget,\n          editor.renderer.scrollBarV && editor.renderer.scrollBarV.inner,\n          editor.renderer.scrollBarH && editor.renderer.scrollBarH.inner,\n          editor.textInput && editor.textInput.getElement(),\n        ].filter(Boolean),\n        [400, 300, 250],\n        this,\n        \"onMouseEvent\",\n        editor,\n      );\n      event.addMouseWheelListener(\n        editor.container,\n        this.onMouseWheel.bind(this, \"mousewheel\"),\n        editor,\n      );\n      addTouchListeners(editor.container, editor);\n      var gutterEl = editor.renderer.$gutter;\n      event.addListener(\n        gutterEl,\n        \"mousedown\",\n        this.onMouseEvent.bind(this, \"guttermousedown\"),\n        editor,\n      );\n      event.addListener(\n        gutterEl,\n        \"click\",\n        this.onMouseEvent.bind(this, \"gutterclick\"),\n        editor,\n      );\n      event.addListener(\n        gutterEl,\n        \"dblclick\",\n        this.onMouseEvent.bind(this, \"gutterdblclick\"),\n        editor,\n      );\n      event.addListener(\n        gutterEl,\n        \"mousemove\",\n        this.onMouseEvent.bind(this, \"guttermousemove\"),\n        editor,\n      );\n      event.addListener(mouseTarget, \"mousedown\", focusEditor, editor);\n      event.addListener(gutterEl, \"mousedown\", focusEditor, editor);\n      if (useragent.isIE && editor.renderer.scrollBarV) {\n        event.addListener(\n          editor.renderer.scrollBarV.element,\n          \"mousedown\",\n          focusEditor,\n          editor,\n        );\n        event.addListener(\n          editor.renderer.scrollBarH.element,\n          \"mousedown\",\n          focusEditor,\n          editor,\n        );\n      }\n      editor.on(\n        \"mousemove\",\n        function (e) {\n          if (_self.state || _self.$dragDelay || !_self.$dragEnabled) return;\n          var character = editor.renderer.screenToTextCoordinates(e.x, e.y);\n          var range = editor.session.selection.getRange();\n          var renderer = editor.renderer;\n          if (\n            !range.isEmpty() &&\n            range.insideStart(character.row, character.column)\n          ) {\n            renderer.setCursorStyle(\"default\");\n          } else {\n            renderer.setCursorStyle(\"\");\n          }\n        }, //@ts-expect-error TODO: seems mistyping - should be boolean\n        editor,\n      );\n    }\n    MouseHandler.prototype.onMouseEvent = function (name, e) {\n      if (!this.editor.session) return;\n      this.editor._emit(name, new MouseEvent(e, this.editor));\n    };\n    MouseHandler.prototype.onMouseMove = function (name, e) {\n      var listeners =\n        this.editor._eventRegistry && this.editor._eventRegistry.mousemove;\n      if (!listeners || !listeners.length) return;\n      this.editor._emit(name, new MouseEvent(e, this.editor));\n    };\n    MouseHandler.prototype.onMouseWheel = function (name, e) {\n      var mouseEvent = new MouseEvent(e, this.editor);\n      mouseEvent.speed = this.$scrollSpeed * 2;\n      mouseEvent.wheelX = e.wheelX;\n      mouseEvent.wheelY = e.wheelY;\n      this.editor._emit(name, mouseEvent);\n    };\n    MouseHandler.prototype.setState = function (state) {\n      this.state = state;\n    };\n    MouseHandler.prototype.captureMouse = function (ev, mouseMoveHandler) {\n      this.x = ev.x;\n      this.y = ev.y;\n      this.isMousePressed = true;\n      var editor = this.editor;\n      var renderer = this.editor.renderer;\n      renderer.$isMousePressed = true;\n      var self = this;\n      var onMouseMove = function (e) {\n        if (!e) return;\n        if (useragent.isWebKit && !e.which && self.releaseMouse)\n          return self.releaseMouse();\n        self.x = e.clientX;\n        self.y = e.clientY;\n        mouseMoveHandler && mouseMoveHandler(e);\n        self.mouseEvent = new MouseEvent(e, self.editor);\n        self.$mouseMoved = true;\n      };\n      var onCaptureEnd = function (e) {\n        editor.off(\"beforeEndOperation\", onOperationEnd);\n        clearInterval(timerId);\n        if (editor.session) onCaptureInterval();\n        self[self.state + \"End\"] && self[self.state + \"End\"](e);\n        self.state = \"\";\n        self.isMousePressed = renderer.$isMousePressed = false;\n        if (renderer.$keepTextAreaAtCursor) renderer.$moveTextAreaToCursor();\n        self.$onCaptureMouseMove = self.releaseMouse = null;\n        e && self.onMouseEvent(\"mouseup\", e);\n        editor.endOperation();\n      };\n      var onCaptureInterval = function () {\n        self[self.state] && self[self.state]();\n        self.$mouseMoved = false;\n      };\n      if (useragent.isOldIE && ev.domEvent.type == \"dblclick\") {\n        return setTimeout(function () {\n          onCaptureEnd(ev);\n        });\n      }\n      var onOperationEnd = function (e) {\n        if (!self.releaseMouse) return;\n        if (editor.curOp.command.name && editor.curOp.selectionChanged) {\n          self[self.state + \"End\"] && self[self.state + \"End\"]();\n          self.state = \"\";\n          self.releaseMouse();\n        }\n      };\n      editor.on(\"beforeEndOperation\", onOperationEnd);\n      editor.startOperation({ command: { name: \"mouse\" } });\n      self.$onCaptureMouseMove = onMouseMove;\n      self.releaseMouse = event.capture(\n        this.editor.container,\n        onMouseMove,\n        onCaptureEnd,\n      );\n      var timerId = setInterval(onCaptureInterval, 20);\n    };\n    MouseHandler.prototype.cancelContextMenu = function () {\n      var stop = function (e) {\n        if (e && e.domEvent && e.domEvent.type != \"contextmenu\") return;\n        this.editor.off(\"nativecontextmenu\", stop);\n        if (e && e.domEvent) event.stopEvent(e.domEvent);\n      }.bind(this);\n      setTimeout(stop, 10);\n      this.editor.on(\"nativecontextmenu\", stop);\n    };\n    MouseHandler.prototype.destroy = function () {\n      if (this.releaseMouse) this.releaseMouse();\n    };\n    return MouseHandler;\n  })();\n  MouseHandler.prototype.releaseMouse = null;\n  config.defineOptions(MouseHandler.prototype, \"mouseHandler\", {\n    scrollSpeed: { initialValue: 2 },\n    dragDelay: { initialValue: useragent.isMac ? 150 : 0 },\n    dragEnabled: { initialValue: true },\n    focusTimeout: { initialValue: 0 },\n    tooltipFollowsMouse: { initialValue: true },\n  });\n  exports.MouseHandler = MouseHandler;\n});\n\ndefine(\"ace/mouse/fold_handler\", [\n  \"require\",\n  \"exports\",\n  \"module\",\n  \"ace/lib/dom\",\n], function (require, exports, module) {\n  \"use strict\";\n  var dom = require(\"../lib/dom\");\n  var FoldHandler = /** @class */ (function () {\n    function FoldHandler(editor) {\n      editor.on(\"click\", function (e) {\n        var position = e.getDocumentPosition();\n        var session = editor.session;\n        var fold = session.getFoldAt(position.row, position.column, 1);\n        if (fold) {\n          if (e.getAccelKey()) session.removeFold(fold);\n          else session.expandFold(fold);\n          e.stop();\n        }\n        var target = e.domEvent && e.domEvent.target;\n        if (target && dom.hasCssClass(target, \"ace_inline_button\")) {\n          if (dom.hasCssClass(target, \"ace_toggle_wrap\")) {\n            session.setOption(\"wrap\", !session.getUseWrapMode());\n            editor.renderer.scrollCursorIntoView();\n          }\n        }\n      });\n      editor.on(\"gutterclick\", function (e) {\n        var gutterRegion = editor.renderer.$gutterLayer.getRegion(e);\n        if (gutterRegion == \"foldWidgets\") {\n          var row = e.getDocumentPosition().row;\n          var session = editor.session;\n          if (session.foldWidgets && session.foldWidgets[row])\n            editor.session.onFoldWidgetClick(row, e);\n          if (!editor.isFocused()) editor.focus();\n          e.stop();\n        }\n      });\n      editor.on(\"gutterdblclick\", function (e) {\n        var gutterRegion = editor.renderer.$gutterLayer.getRegion(e);\n        if (gutterRegion == \"foldWidgets\") {\n          var row = e.getDocumentPosition().row;\n          var session = editor.session;\n          var data = session.getParentFoldRangeData(row, true);\n          var range = data.range || data.firstRange;\n          if (range) {\n            row = range.start.row;\n            var fold = session.getFoldAt(row, session.getLine(row).length, 1);\n            if (fold) {\n              session.removeFold(fold);\n            } else {\n              session.addFold(\"...\", range);\n              editor.renderer.scrollCursorIntoView({\n                row: range.start.row,\n                column: 0,\n              });\n            }\n          }\n          e.stop();\n        }\n      });\n    }\n    return FoldHandler;\n  })();\n  exports.FoldHandler = FoldHandler;\n});\n\ndefine(\"ace/keyboard/keybinding\", [\n  \"require\",\n  \"exports\",\n  \"module\",\n  \"ace/lib/keys\",\n  \"ace/lib/event\",\n], function (require, exports, module) {\n  \"use strict\";\n  var keyUtil = require(\"../lib/keys\");\n  var event = require(\"../lib/event\");\n  var KeyBinding = /** @class */ (function () {\n    function KeyBinding(editor) {\n      this.$editor = editor;\n      this.$data = { editor: editor };\n      this.$handlers = [];\n      this.setDefaultHandler(editor.commands);\n    }\n    KeyBinding.prototype.setDefaultHandler = function (kb) {\n      this.removeKeyboardHandler(this.$defaultHandler);\n      this.$defaultHandler = kb;\n      this.addKeyboardHandler(kb, 0);\n    };\n    KeyBinding.prototype.setKeyboardHandler = function (kb) {\n      var h = this.$handlers;\n      if (h[h.length - 1] == kb) return;\n      while (h[h.length - 1] && h[h.length - 1] != this.$defaultHandler)\n        this.removeKeyboardHandler(h[h.length - 1]);\n      this.addKeyboardHandler(kb, 1);\n    };\n    KeyBinding.prototype.addKeyboardHandler = function (kb, pos) {\n      if (!kb) return;\n      if (typeof kb == \"function\" && !kb.handleKeyboard) kb.handleKeyboard = kb;\n      var i = this.$handlers.indexOf(kb);\n      if (i != -1) this.$handlers.splice(i, 1);\n      if (pos == undefined) this.$handlers.push(kb);\n      else this.$handlers.splice(pos, 0, kb);\n      if (i == -1 && kb.attach) kb.attach(this.$editor);\n    };\n    KeyBinding.prototype.removeKeyboardHandler = function (kb) {\n      var i = this.$handlers.indexOf(kb);\n      if (i == -1) return false;\n      this.$handlers.splice(i, 1);\n      kb.detach && kb.detach(this.$editor);\n      return true;\n    };\n    KeyBinding.prototype.getKeyboardHandler = function () {\n      return this.$handlers[this.$handlers.length - 1];\n    };\n    KeyBinding.prototype.getStatusText = function () {\n      var data = this.$data;\n      var editor = data.editor;\n      return this.$handlers\n        .map(function (h) {\n          return (h.getStatusText && h.getStatusText(editor, data)) || \"\";\n        })\n        .filter(Boolean)\n        .join(\" \");\n    };\n    KeyBinding.prototype.$callKeyboardHandlers = function (\n      hashId,\n      keyString,\n      keyCode,\n      e,\n    ) {\n      var toExecute;\n      var success = false;\n      var commands = this.$editor.commands;\n      for (var i = this.$handlers.length; i--; ) {\n        toExecute = this.$handlers[i].handleKeyboard(\n          this.$data,\n          hashId,\n          keyString,\n          keyCode,\n          e,\n        );\n        if (!toExecute || !toExecute.command) continue;\n        if (toExecute.command == \"null\") {\n          success = true;\n        } else {\n          success = commands.exec(\n            toExecute.command,\n            this.$editor,\n            toExecute.args,\n            e,\n          );\n        }\n        if (\n          success &&\n          e &&\n          hashId != -1 &&\n          toExecute[\"passEvent\"] != true &&\n          toExecute.command[\"passEvent\"] != true\n        ) {\n          event.stopEvent(e);\n        }\n        if (success) break;\n      }\n      if (!success && hashId == -1) {\n        toExecute = { command: \"insertstring\" };\n        success = commands.exec(\"insertstring\", this.$editor, keyString);\n      }\n      if (success && this.$editor._signal)\n        this.$editor._signal(\"keyboardActivity\", toExecute);\n      return success;\n    };\n    KeyBinding.prototype.onCommandKey = function (e, hashId, keyCode) {\n      var keyString = keyUtil.keyCodeToString(keyCode);\n      return this.$callKeyboardHandlers(hashId, keyString, keyCode, e);\n    };\n    KeyBinding.prototype.onTextInput = function (text) {\n      return this.$callKeyboardHandlers(-1, text);\n    };\n    return KeyBinding;\n  })();\n  exports.KeyBinding = KeyBinding;\n});\n\ndefine(\"ace/lib/bidiutil\", [\"require\", \"exports\", \"module\"], function (\n  require,\n  exports,\n  module,\n) {\n  \"use strict\";\n  var ArabicAlefBetIntervalsBegine = [\"\\u0621\", \"\\u0641\"];\n  var ArabicAlefBetIntervalsEnd = [\"\\u063A\", \"\\u064a\"];\n  var dir = 0,\n    hiLevel = 0;\n  var lastArabic = false,\n    hasUBAT_AL = false,\n    hasUBAT_B = false,\n    hasUBAT_S = false,\n    hasBlockSep = false,\n    hasSegSep = false;\n  var impTab_LTR = [\n    [0, 3, 0, 1, 0, 0, 0],\n    [0, 3, 0, 1, 2, 2, 0],\n    [0, 3, 0, 0x11, 2, 0, 1],\n    [0, 3, 5, 5, 4, 1, 0],\n    [0, 3, 0x15, 0x15, 4, 0, 1],\n    [0, 3, 5, 5, 4, 2, 0],\n  ];\n  var impTab_RTL = [\n    [2, 0, 1, 1, 0, 1, 0],\n    [2, 0, 1, 1, 0, 2, 0],\n    [2, 0, 2, 1, 3, 2, 0],\n    [2, 0, 2, 0x21, 3, 1, 1],\n  ];\n  var LTR = 0,\n    RTL = 1;\n  var L = 0;\n  var R = 1;\n  var EN = 2;\n  var AN = 3;\n  var ON = 4;\n  var B = 5;\n  var S = 6;\n  var AL = 7;\n  var WS = 8;\n  var CS = 9;\n  var ES = 10;\n  var ET = 11;\n  var NSM = 12;\n  var LRE = 13;\n  var RLE = 14;\n  var PDF = 15;\n  var LRO = 16;\n  var RLO = 17;\n  var BN = 18;\n  var UnicodeTBL00 = [\n    BN,\n    BN,\n    BN,\n    BN,\n    BN,\n    BN,\n    BN,\n    BN,\n    BN,\n    S,\n    B,\n    S,\n    WS,\n    B,\n    BN,\n    BN,\n    BN,\n    BN,\n    BN,\n    BN,\n    BN,\n    BN,\n    BN,\n    BN,\n    BN,\n    BN,\n    BN,\n    BN,\n    B,\n    B,\n    B,\n    S,\n    WS,\n    ON,\n    ON,\n    ET,\n    ET,\n    ET,\n    ON,\n    ON,\n    ON,\n    ON,\n    ON,\n    ES,\n    CS,\n    ES,\n    CS,\n    CS,\n    EN,\n    EN,\n    EN,\n    EN,\n    EN,\n    EN,\n    EN,\n    EN,\n    EN,\n    EN,\n    CS,\n    ON,\n    ON,\n    ON,\n    ON,\n    ON,\n    ON,\n    L,\n    L,\n    L,\n    L,\n    L,\n    L,\n    L,\n    L,\n    L,\n    L,\n    L,\n    L,\n    L,\n    L,\n    L,\n    L,\n    L,\n    L,\n    L,\n    L,\n    L,\n    L,\n    L,\n    L,\n    L,\n    L,\n    ON,\n    ON,\n    ON,\n    ON,\n    ON,\n    ON,\n    L,\n    L,\n    L,\n    L,\n    L,\n    L,\n    L,\n    L,\n    L,\n    L,\n    L,\n    L,\n    L,\n    L,\n    L,\n    L,\n    L,\n    L,\n    L,\n    L,\n    L,\n    L,\n    L,\n    L,\n    L,\n    L,\n    ON,\n    ON,\n    ON,\n    ON,\n    BN,\n    BN,\n    BN,\n    BN,\n    BN,\n    BN,\n    B,\n    BN,\n    BN,\n    BN,\n    BN,\n    BN,\n    BN,\n    BN,\n    BN,\n    BN,\n    BN,\n    BN,\n    BN,\n    BN,\n    BN,\n    BN,\n    BN,\n    BN,\n    BN,\n    BN,\n    BN,\n    BN,\n    BN,\n    BN,\n    BN,\n    BN,\n    BN,\n    CS,\n    ON,\n    ET,\n    ET,\n    ET,\n    ET,\n    ON,\n    ON,\n    ON,\n    ON,\n    L,\n    ON,\n    ON,\n    BN,\n    ON,\n    ON,\n    ET,\n    ET,\n    EN,\n    EN,\n    ON,\n    L,\n    ON,\n    ON,\n    ON,\n    EN,\n    L,\n    ON,\n    ON,\n    ON,\n    ON,\n    ON,\n  ];\n  var UnicodeTBL20 = [\n    WS,\n    WS,\n    WS,\n    WS,\n    WS,\n    WS,\n    WS,\n    WS,\n    WS,\n    WS,\n    WS,\n    BN,\n    BN,\n    BN,\n    L,\n    R,\n    ON,\n    ON,\n    ON,\n    ON,\n    ON,\n    ON,\n    ON,\n    ON,\n    ON,\n    ON,\n    ON,\n    ON,\n    ON,\n    ON,\n    ON,\n    ON,\n    ON,\n    ON,\n    ON,\n    ON,\n    ON,\n    ON,\n    ON,\n    ON,\n    WS,\n    B,\n    LRE,\n    RLE,\n    PDF,\n    LRO,\n    RLO,\n    CS,\n    ET,\n    ET,\n    ET,\n    ET,\n    ET,\n    ON,\n    ON,\n    ON,\n    ON,\n    ON,\n    ON,\n    ON,\n    ON,\n    ON,\n    ON,\n    ON,\n    ON,\n    ON,\n    ON,\n    ON,\n    CS,\n    ON,\n    ON,\n    ON,\n    ON,\n    ON,\n    ON,\n    ON,\n    ON,\n    ON,\n    ON,\n    ON,\n    ON,\n    ON,\n    ON,\n    ON,\n    ON,\n    ON,\n    ON,\n    ON,\n    ON,\n    ON,\n    ON,\n    ON,\n    ON,\n    ON,\n    ON,\n    WS,\n  ];\n  function _computeLevels(chars, levels, len, charTypes) {\n    var impTab = dir ? impTab_RTL : impTab_LTR,\n      prevState = null,\n      newClass = null,\n      newLevel = null,\n      newState = 0,\n      action = null,\n      cond = null,\n      condPos = -1,\n      i = null,\n      ix = null,\n      classes = [];\n    if (!charTypes) {\n      for (i = 0, charTypes = []; i < len; i++) {\n        charTypes[i] = _getCharacterType(chars[i]);\n      }\n    }\n    hiLevel = dir;\n    lastArabic = false;\n    hasUBAT_AL = false;\n    hasUBAT_B = false;\n    hasUBAT_S = false;\n    for (ix = 0; ix < len; ix++) {\n      prevState = newState;\n      classes[ix] = newClass = _getCharClass(chars, charTypes, classes, ix);\n      newState = impTab[prevState][newClass];\n      action = newState & 0xf0;\n      newState &= 0x0f;\n      levels[ix] = newLevel = impTab[newState][5];\n      if (action > 0) {\n        if (action == 0x10) {\n          for (i = condPos; i < ix; i++) {\n            levels[i] = 1;\n          }\n          condPos = -1;\n        } else {\n          condPos = -1;\n        }\n      }\n      cond = impTab[newState][6];\n      if (cond) {\n        if (condPos == -1) {\n          condPos = ix;\n        }\n      } else {\n        if (condPos > -1) {\n          for (i = condPos; i < ix; i++) {\n            levels[i] = newLevel;\n          }\n          condPos = -1;\n        }\n      }\n      if (charTypes[ix] == B) {\n        levels[ix] = 0;\n      }\n      hiLevel |= newLevel;\n    }\n    if (hasUBAT_S) {\n      for (i = 0; i < len; i++) {\n        if (charTypes[i] == S) {\n          levels[i] = dir;\n          for (var j = i - 1; j >= 0; j--) {\n            if (charTypes[j] == WS) {\n              levels[j] = dir;\n            } else {\n              break;\n            }\n          }\n        }\n      }\n    }\n  }\n  function _invertLevel(lev, levels, _array) {\n    if (hiLevel < lev) {\n      return;\n    }\n    if (lev == 1 && dir == RTL && !hasUBAT_B) {\n      _array.reverse();\n      return;\n    }\n    var len = _array.length,\n      start = 0,\n      end,\n      lo,\n      hi,\n      tmp;\n    while (start < len) {\n      if (levels[start] >= lev) {\n        end = start + 1;\n        while (end < len && levels[end] >= lev) {\n          end++;\n        }\n        for (lo = start, hi = end - 1; lo < hi; lo++, hi--) {\n          tmp = _array[lo];\n          _array[lo] = _array[hi];\n          _array[hi] = tmp;\n        }\n        start = end;\n      }\n      start++;\n    }\n  }\n  function _getCharClass(chars, types, classes, ix) {\n    var cType = types[ix],\n      wType,\n      nType,\n      len,\n      i;\n    switch (cType) {\n      case L:\n      case R:\n        lastArabic = false;\n      case ON:\n      case AN:\n        return cType;\n      case EN:\n        return lastArabic ? AN : EN;\n      case AL:\n        lastArabic = true;\n        hasUBAT_AL = true;\n        return R;\n      case WS:\n        return ON;\n      case CS:\n        if (\n          ix < 1 ||\n          ix + 1 >= types.length ||\n          ((wType = classes[ix - 1]) != EN && wType != AN) ||\n          ((nType = types[ix + 1]) != EN && nType != AN)\n        ) {\n          return ON;\n        }\n        if (lastArabic) {\n          nType = AN;\n        }\n        return nType == wType ? nType : ON;\n      case ES:\n        wType = ix > 0 ? classes[ix - 1] : B;\n        if (wType == EN && ix + 1 < types.length && types[ix + 1] == EN) {\n          return EN;\n        }\n        return ON;\n      case ET:\n        if (ix > 0 && classes[ix - 1] == EN) {\n          return EN;\n        }\n        if (lastArabic) {\n          return ON;\n        }\n        i = ix + 1;\n        len = types.length;\n        while (i < len && types[i] == ET) {\n          i++;\n        }\n        if (i < len && types[i] == EN) {\n          return EN;\n        }\n        return ON;\n      case NSM:\n        len = types.length;\n        i = ix + 1;\n        while (i < len && types[i] == NSM) {\n          i++;\n        }\n        if (i < len) {\n          var c = chars[ix],\n            rtlCandidate = (c >= 0x0591 && c <= 0x08ff) || c == 0xfb1e;\n          wType = types[i];\n          if (rtlCandidate && (wType == R || wType == AL)) {\n            return R;\n          }\n        }\n        if (ix < 1 || (wType = types[ix - 1]) == B) {\n          return ON;\n        }\n        return classes[ix - 1];\n      case B:\n        lastArabic = false;\n        hasUBAT_B = true;\n        return dir;\n      case S:\n        hasUBAT_S = true;\n        return ON;\n      case LRE:\n      case RLE:\n      case LRO:\n      case RLO:\n      case PDF:\n        lastArabic = false;\n      case BN:\n        return ON;\n    }\n  }\n  function _getCharacterType(ch) {\n    var uc = ch.charCodeAt(0),\n      hi = uc >> 8;\n    if (hi == 0) {\n      return uc > 0x00bf ? L : UnicodeTBL00[uc];\n    } else if (hi == 5) {\n      return /[\\u0591-\\u05f4]/.test(ch) ? R : L;\n    } else if (hi == 6) {\n      if (/[\\u0610-\\u061a\\u064b-\\u065f\\u06d6-\\u06e4\\u06e7-\\u06ed]/.test(ch))\n        return NSM;\n      else if (/[\\u0660-\\u0669\\u066b-\\u066c]/.test(ch)) return AN;\n      else if (uc == 0x066a) return ET;\n      else if (/[\\u06f0-\\u06f9]/.test(ch)) return EN;\n      else return AL;\n    } else if (hi == 0x20 && uc <= 0x205f) {\n      return UnicodeTBL20[uc & 0xff];\n    } else if (hi == 0xfe) {\n      return uc >= 0xfe70 ? AL : ON;\n    }\n    return ON;\n  }\n  function _isArabicDiacritics(ch) {\n    return ch >= \"\\u064b\" && ch <= \"\\u0655\";\n  }\n  exports.L = L;\n  exports.R = R;\n  exports.EN = EN;\n  exports.ON_R = 3;\n  exports.AN = 4;\n  exports.R_H = 5;\n  exports.B = 6;\n  exports.RLE = 7;\n  exports.DOT = \"\\xB7\";\n  exports.doBidiReorder = function (text, textCharTypes, isRtl) {\n    if (text.length < 2) return {};\n    var chars = text.split(\"\"),\n      logicalFromVisual = new Array(chars.length),\n      bidiLevels = new Array(chars.length),\n      levels = [];\n    dir = isRtl ? RTL : LTR;\n    _computeLevels(chars, levels, chars.length, textCharTypes);\n    for (\n      var i = 0;\n      i < logicalFromVisual.length;\n      logicalFromVisual[i] = i, i++\n    );\n    _invertLevel(2, levels, logicalFromVisual);\n    _invertLevel(1, levels, logicalFromVisual);\n    for (var i = 0; i < logicalFromVisual.length - 1; i++) {\n      //fix levels to reflect character width\n      if (textCharTypes[i] === AN) {\n        levels[i] = exports.AN;\n      } else if (\n        levels[i] === R &&\n        ((textCharTypes[i] > AL && textCharTypes[i] < LRE) ||\n          textCharTypes[i] === ON ||\n          textCharTypes[i] === BN)\n      ) {\n        levels[i] = exports.ON_R;\n      } else if (\n        i > 0 &&\n        chars[i - 1] === \"\\u0644\" &&\n        /\\u0622|\\u0623|\\u0625|\\u0627/.test(chars[i])\n      ) {\n        levels[i - 1] = levels[i] = exports.R_H;\n        i++;\n      }\n    }\n    if (chars[chars.length - 1] === exports.DOT)\n      levels[chars.length - 1] = exports.B;\n    if (chars[0] === \"\\u202B\") levels[0] = exports.RLE;\n    for (var i = 0; i < logicalFromVisual.length; i++) {\n      bidiLevels[i] = levels[logicalFromVisual[i]];\n    }\n    return { logicalFromVisual: logicalFromVisual, bidiLevels: bidiLevels };\n  };\n  exports.hasBidiCharacters = function (text, textCharTypes) {\n    var ret = false;\n    for (var i = 0; i < text.length; i++) {\n      textCharTypes[i] = _getCharacterType(text.charAt(i));\n      if (\n        !ret &&\n        (textCharTypes[i] == R ||\n          textCharTypes[i] == AL ||\n          textCharTypes[i] == AN)\n      )\n        ret = true;\n    }\n    return ret;\n  };\n  exports.getVisualFromLogicalIdx = function (logIdx, rowMap) {\n    for (var i = 0; i < rowMap.logicalFromVisual.length; i++) {\n      if (rowMap.logicalFromVisual[i] == logIdx) return i;\n    }\n    return 0;\n  };\n});\n\ndefine(\"ace/bidihandler\", [\n  \"require\",\n  \"exports\",\n  \"module\",\n  \"ace/lib/bidiutil\",\n  \"ace/lib/lang\",\n], function (require, exports, module) {\n  \"use strict\";\n  var bidiUtil = require(\"./lib/bidiutil\");\n  var lang = require(\"./lib/lang\");\n  var bidiRE = /[\\u0590-\\u05f4\\u0600-\\u06ff\\u0700-\\u08ac\\u202B]/;\n  var BidiHandler = /** @class */ (function () {\n    function BidiHandler(session) {\n      this.session = session;\n      this.bidiMap = {};\n      this.currentRow = null;\n      this.bidiUtil = bidiUtil;\n      this.charWidths = [];\n      this.EOL = \"\\xAC\";\n      this.showInvisibles = true;\n      this.isRtlDir = false;\n      this.$isRtl = false;\n      this.line = \"\";\n      this.wrapIndent = 0;\n      this.EOF = \"\\xB6\";\n      this.RLE = \"\\u202B\";\n      this.contentWidth = 0;\n      this.fontMetrics = null;\n      this.rtlLineOffset = 0;\n      this.wrapOffset = 0;\n      this.isMoveLeftOperation = false;\n      this.seenBidi = bidiRE.test(session.getValue());\n    }\n    BidiHandler.prototype.isBidiRow = function (screenRow, docRow, splitIndex) {\n      if (!this.seenBidi) return false;\n      if (screenRow !== this.currentRow) {\n        this.currentRow = screenRow;\n        this.updateRowLine(docRow, splitIndex);\n        this.updateBidiMap();\n      }\n      return this.bidiMap.bidiLevels;\n    };\n    BidiHandler.prototype.onChange = function (delta) {\n      if (!this.seenBidi) {\n        if (delta.action == \"insert\" && bidiRE.test(delta.lines.join(\"\\n\"))) {\n          this.seenBidi = true;\n          this.currentRow = null;\n        }\n      } else {\n        this.currentRow = null;\n      }\n    };\n    BidiHandler.prototype.getDocumentRow = function () {\n      var docRow = 0;\n      var rowCache = this.session.$screenRowCache;\n      if (rowCache.length) {\n        var index = this.session.$getRowCacheIndex(rowCache, this.currentRow);\n        if (index >= 0) docRow = this.session.$docRowCache[index];\n      }\n      return docRow;\n    };\n    BidiHandler.prototype.getSplitIndex = function () {\n      var splitIndex = 0;\n      var rowCache = this.session.$screenRowCache;\n      if (rowCache.length) {\n        var currentIndex,\n          prevIndex = this.session.$getRowCacheIndex(rowCache, this.currentRow);\n        while (this.currentRow - splitIndex > 0) {\n          currentIndex = this.session.$getRowCacheIndex(\n            rowCache,\n            this.currentRow - splitIndex - 1,\n          );\n          if (currentIndex !== prevIndex) break;\n          prevIndex = currentIndex;\n          splitIndex++;\n        }\n      } else {\n        splitIndex = this.currentRow;\n      }\n      return splitIndex;\n    };\n    BidiHandler.prototype.updateRowLine = function (docRow, splitIndex) {\n      if (docRow === undefined) docRow = this.getDocumentRow();\n      var isLastRow = docRow === this.session.getLength() - 1,\n        endOfLine = isLastRow ? this.EOF : this.EOL;\n      this.wrapIndent = 0;\n      this.line = this.session.getLine(docRow);\n      this.isRtlDir = this.$isRtl || this.line.charAt(0) === this.RLE;\n      if (this.session.$useWrapMode) {\n        var splits = this.session.$wrapData[docRow];\n        if (splits) {\n          if (splitIndex === undefined) splitIndex = this.getSplitIndex();\n          if (splitIndex > 0 && splits.length) {\n            this.wrapIndent = splits.indent;\n            this.wrapOffset = this.wrapIndent * this.charWidths[bidiUtil.L];\n            this.line =\n              splitIndex < splits.length\n                ? this.line.substring(\n                    splits[splitIndex - 1],\n                    splits[splitIndex],\n                  )\n                : this.line.substring(splits[splits.length - 1]);\n          } else {\n            this.line = this.line.substring(0, splits[splitIndex]);\n          }\n          if (splitIndex == splits.length) {\n            this.line += this.showInvisibles ? endOfLine : bidiUtil.DOT;\n          }\n        }\n      } else {\n        this.line += this.showInvisibles ? endOfLine : bidiUtil.DOT;\n      }\n      var session = this.session,\n        shift = 0,\n        size;\n      this.line = this.line.replace(\n        /\\t|[\\u1100-\\u2029, \\u202F-\\uFFE6]/g,\n        function (ch, i) {\n          if (ch === \"\\t\" || session.isFullWidth(ch.charCodeAt(0))) {\n            size = ch === \"\\t\" ? session.getScreenTabSize(i + shift) : 2;\n            shift += size - 1;\n            return lang.stringRepeat(bidiUtil.DOT, size);\n          }\n          return ch;\n        },\n      );\n      if (this.isRtlDir) {\n        this.fontMetrics.$main.textContent =\n          this.line.charAt(this.line.length - 1) == bidiUtil.DOT\n            ? this.line.substr(0, this.line.length - 1)\n            : this.line;\n        this.rtlLineOffset =\n          this.contentWidth -\n          this.fontMetrics.$main.getBoundingClientRect().width;\n      }\n    };\n    BidiHandler.prototype.updateBidiMap = function () {\n      var textCharTypes = [];\n      if (\n        bidiUtil.hasBidiCharacters(this.line, textCharTypes) ||\n        this.isRtlDir\n      ) {\n        this.bidiMap = bidiUtil.doBidiReorder(\n          this.line,\n          textCharTypes,\n          this.isRtlDir,\n        );\n      } else {\n        this.bidiMap = {};\n      }\n    };\n    BidiHandler.prototype.markAsDirty = function () {\n      this.currentRow = null;\n    };\n    BidiHandler.prototype.updateCharacterWidths = function (fontMetrics) {\n      if (this.characterWidth === fontMetrics.$characterSize.width) return;\n      this.fontMetrics = fontMetrics;\n      var characterWidth = (this.characterWidth =\n        fontMetrics.$characterSize.width);\n      var bidiCharWidth = fontMetrics.$measureCharWidth(\"\\u05d4\");\n      this.charWidths[bidiUtil.L] =\n        this.charWidths[bidiUtil.EN] =\n        this.charWidths[bidiUtil.ON_R] =\n          characterWidth;\n      this.charWidths[bidiUtil.R] = this.charWidths[bidiUtil.AN] =\n        bidiCharWidth;\n      this.charWidths[bidiUtil.R_H] = bidiCharWidth * 0.45;\n      this.charWidths[bidiUtil.B] = this.charWidths[bidiUtil.RLE] = 0;\n      this.currentRow = null;\n    };\n    BidiHandler.prototype.setShowInvisibles = function (showInvisibles) {\n      this.showInvisibles = showInvisibles;\n      this.currentRow = null;\n    };\n    BidiHandler.prototype.setEolChar = function (eolChar) {\n      this.EOL = eolChar;\n    };\n    BidiHandler.prototype.setContentWidth = function (width) {\n      this.contentWidth = width;\n    };\n    BidiHandler.prototype.isRtlLine = function (row) {\n      if (this.$isRtl) return true;\n      if (row != undefined)\n        return this.session.getLine(row).charAt(0) == this.RLE;\n      else return this.isRtlDir;\n    };\n    BidiHandler.prototype.setRtlDirection = function (editor, isRtlDir) {\n      var cursor = editor.getCursorPosition();\n      for (\n        var row = editor.selection.getSelectionAnchor().row;\n        row <= cursor.row;\n        row++\n      ) {\n        if (\n          !isRtlDir &&\n          editor.session.getLine(row).charAt(0) ===\n            editor.session.$bidiHandler.RLE\n        )\n          editor.session.doc.removeInLine(row, 0, 1);\n        else if (\n          isRtlDir &&\n          editor.session.getLine(row).charAt(0) !==\n            editor.session.$bidiHandler.RLE\n        )\n          editor.session.doc.insert(\n            { column: 0, row: row },\n            editor.session.$bidiHandler.RLE,\n          );\n      }\n    };\n    BidiHandler.prototype.getPosLeft = function (col) {\n      col -= this.wrapIndent;\n      var leftBoundary = this.line.charAt(0) === this.RLE ? 1 : 0;\n      var logicalIdx =\n        col > leftBoundary\n          ? this.session.getOverwrite()\n            ? col\n            : col - 1\n          : leftBoundary;\n      var visualIdx = bidiUtil.getVisualFromLogicalIdx(\n          logicalIdx,\n          this.bidiMap,\n        ),\n        levels = this.bidiMap.bidiLevels,\n        left = 0;\n      if (\n        !this.session.getOverwrite() &&\n        col <= leftBoundary &&\n        levels[visualIdx] % 2 !== 0\n      )\n        visualIdx++;\n      for (var i = 0; i < visualIdx; i++) {\n        left += this.charWidths[levels[i]];\n      }\n      if (\n        !this.session.getOverwrite() &&\n        col > leftBoundary &&\n        levels[visualIdx] % 2 === 0\n      )\n        left += this.charWidths[levels[visualIdx]];\n      if (this.wrapIndent)\n        left += this.isRtlDir ? -1 * this.wrapOffset : this.wrapOffset;\n      if (this.isRtlDir) left += this.rtlLineOffset;\n      return left;\n    };\n    BidiHandler.prototype.getSelections = function (startCol, endCol) {\n      var map = this.bidiMap,\n        levels = map.bidiLevels,\n        level,\n        selections = [],\n        offset = 0,\n        selColMin = Math.min(startCol, endCol) - this.wrapIndent,\n        selColMax = Math.max(startCol, endCol) - this.wrapIndent,\n        isSelected = false,\n        isSelectedPrev = false,\n        selectionStart = 0;\n      if (this.wrapIndent)\n        offset += this.isRtlDir ? -1 * this.wrapOffset : this.wrapOffset;\n      for (var logIdx, visIdx = 0; visIdx < levels.length; visIdx++) {\n        logIdx = map.logicalFromVisual[visIdx];\n        level = levels[visIdx];\n        isSelected = logIdx >= selColMin && logIdx < selColMax;\n        if (isSelected && !isSelectedPrev) {\n          selectionStart = offset;\n        } else if (!isSelected && isSelectedPrev) {\n          selections.push({\n            left: selectionStart,\n            width: offset - selectionStart,\n          });\n        }\n        offset += this.charWidths[level];\n        isSelectedPrev = isSelected;\n      }\n      if (isSelected && visIdx === levels.length) {\n        selections.push({\n          left: selectionStart,\n          width: offset - selectionStart,\n        });\n      }\n      if (this.isRtlDir) {\n        for (var i = 0; i < selections.length; i++) {\n          selections[i].left += this.rtlLineOffset;\n        }\n      }\n      return selections;\n    };\n    BidiHandler.prototype.offsetToCol = function (posX) {\n      if (this.isRtlDir) posX -= this.rtlLineOffset;\n      var logicalIdx = 0,\n        posX = Math.max(posX, 0),\n        offset = 0,\n        visualIdx = 0,\n        levels = this.bidiMap.bidiLevels,\n        charWidth = this.charWidths[levels[visualIdx]];\n      if (this.wrapIndent)\n        posX -= this.isRtlDir ? -1 * this.wrapOffset : this.wrapOffset;\n      while (posX > offset + charWidth / 2) {\n        offset += charWidth;\n        if (visualIdx === levels.length - 1) {\n          charWidth = 0;\n          break;\n        }\n        charWidth = this.charWidths[levels[++visualIdx]];\n      }\n      if (\n        visualIdx > 0 &&\n        levels[visualIdx - 1] % 2 !== 0 &&\n        levels[visualIdx] % 2 === 0\n      ) {\n        if (posX < offset) visualIdx--;\n        logicalIdx = this.bidiMap.logicalFromVisual[visualIdx];\n      } else if (\n        visualIdx > 0 &&\n        levels[visualIdx - 1] % 2 === 0 &&\n        levels[visualIdx] % 2 !== 0\n      ) {\n        logicalIdx =\n          1 +\n          (posX > offset\n            ? this.bidiMap.logicalFromVisual[visualIdx]\n            : this.bidiMap.logicalFromVisual[visualIdx - 1]);\n      } else if (\n        (this.isRtlDir &&\n          visualIdx === levels.length - 1 &&\n          charWidth === 0 &&\n          levels[visualIdx - 1] % 2 === 0) ||\n        (!this.isRtlDir && visualIdx === 0 && levels[visualIdx] % 2 !== 0)\n      ) {\n        logicalIdx = 1 + this.bidiMap.logicalFromVisual[visualIdx];\n      } else {\n        if (visualIdx > 0 && levels[visualIdx - 1] % 2 !== 0 && charWidth !== 0)\n          visualIdx--;\n        logicalIdx = this.bidiMap.logicalFromVisual[visualIdx];\n      }\n      if (logicalIdx === 0 && this.isRtlDir) logicalIdx++;\n      return logicalIdx + this.wrapIndent;\n    };\n    return BidiHandler;\n  })();\n  exports.BidiHandler = BidiHandler;\n});\n\ndefine(\"ace/selection\", [\n  \"require\",\n  \"exports\",\n  \"module\",\n  \"ace/lib/oop\",\n  \"ace/lib/lang\",\n  \"ace/lib/event_emitter\",\n  \"ace/range\",\n], function (require, exports, module) {\n  \"use strict\";\n  var oop = require(\"./lib/oop\");\n  var lang = require(\"./lib/lang\");\n  var EventEmitter = require(\"./lib/event_emitter\").EventEmitter;\n  var Range = require(\"./range\").Range;\n  var Selection = /** @class */ (function () {\n    function Selection(session) {\n      this.session = session;\n      this.doc = session.getDocument();\n      this.clearSelection();\n      this.cursor = this.lead = this.doc.createAnchor(0, 0);\n      this.anchor = this.doc.createAnchor(0, 0);\n      this.$silent = false;\n      var self = this;\n      this.cursor.on(\"change\", function (e) {\n        self.$cursorChanged = true;\n        if (!self.$silent) self._emit(\"changeCursor\");\n        if (!self.$isEmpty && !self.$silent) self._emit(\"changeSelection\");\n        if (!self.$keepDesiredColumnOnChange && e.old.column != e.value.column)\n          self.$desiredColumn = null;\n      });\n      this.anchor.on(\"change\", function () {\n        self.$anchorChanged = true;\n        if (!self.$isEmpty && !self.$silent) self._emit(\"changeSelection\");\n      });\n    }\n    Selection.prototype.isEmpty = function () {\n      return (\n        this.$isEmpty ||\n        (this.anchor.row == this.lead.row &&\n          this.anchor.column == this.lead.column)\n      );\n    };\n    Selection.prototype.isMultiLine = function () {\n      return !this.$isEmpty && this.anchor.row != this.cursor.row;\n    };\n    Selection.prototype.getCursor = function () {\n      return this.lead.getPosition();\n    };\n    Selection.prototype.setAnchor = function (row, column) {\n      this.$isEmpty = false;\n      this.anchor.setPosition(row, column);\n    };\n    Selection.prototype.getAnchor = function () {\n      if (this.$isEmpty) return this.getSelectionLead();\n      return this.anchor.getPosition();\n    };\n    Selection.prototype.getSelectionLead = function () {\n      return this.lead.getPosition();\n    };\n    Selection.prototype.isBackwards = function () {\n      var anchor = this.anchor;\n      var lead = this.lead;\n      return (\n        anchor.row > lead.row ||\n        (anchor.row == lead.row && anchor.column > lead.column)\n      );\n    };\n    Selection.prototype.getRange = function () {\n      var anchor = this.anchor;\n      var lead = this.lead;\n      if (this.$isEmpty) return Range.fromPoints(lead, lead);\n      return this.isBackwards()\n        ? Range.fromPoints(lead, anchor)\n        : Range.fromPoints(anchor, lead);\n    };\n    Selection.prototype.clearSelection = function () {\n      if (!this.$isEmpty) {\n        this.$isEmpty = true;\n        this._emit(\"changeSelection\");\n      }\n    };\n    Selection.prototype.selectAll = function () {\n      this.$setSelection(0, 0, Number.MAX_VALUE, Number.MAX_VALUE);\n    };\n    Selection.prototype.setRange = function (range, reverse) {\n      var start = reverse ? range.end : range.start;\n      var end = reverse ? range.start : range.end;\n      this.$setSelection(start.row, start.column, end.row, end.column);\n    };\n    Selection.prototype.$setSelection = function (\n      anchorRow,\n      anchorColumn,\n      cursorRow,\n      cursorColumn,\n    ) {\n      if (this.$silent) return;\n      var wasEmpty = this.$isEmpty;\n      var wasMultiselect = this.inMultiSelectMode;\n      this.$silent = true;\n      this.$cursorChanged = this.$anchorChanged = false;\n      this.anchor.setPosition(anchorRow, anchorColumn);\n      this.cursor.setPosition(cursorRow, cursorColumn);\n      this.$isEmpty = !Range.comparePoints(this.anchor, this.cursor);\n      this.$silent = false;\n      if (this.$cursorChanged) this._emit(\"changeCursor\");\n      if (\n        this.$cursorChanged ||\n        this.$anchorChanged ||\n        wasEmpty != this.$isEmpty ||\n        wasMultiselect\n      )\n        this._emit(\"changeSelection\");\n    };\n    Selection.prototype.$moveSelection = function (mover) {\n      var lead = this.lead;\n      if (this.$isEmpty) this.setSelectionAnchor(lead.row, lead.column);\n      mover.call(this);\n    };\n    Selection.prototype.selectTo = function (row, column) {\n      this.$moveSelection(function () {\n        this.moveCursorTo(row, column);\n      });\n    };\n    Selection.prototype.selectToPosition = function (pos) {\n      this.$moveSelection(function () {\n        this.moveCursorToPosition(pos);\n      });\n    };\n    Selection.prototype.moveTo = function (row, column) {\n      this.clearSelection();\n      this.moveCursorTo(row, column);\n    };\n    Selection.prototype.moveToPosition = function (pos) {\n      this.clearSelection();\n      this.moveCursorToPosition(pos);\n    };\n    Selection.prototype.selectUp = function () {\n      this.$moveSelection(this.moveCursorUp);\n    };\n    Selection.prototype.selectDown = function () {\n      this.$moveSelection(this.moveCursorDown);\n    };\n    Selection.prototype.selectRight = function () {\n      this.$moveSelection(this.moveCursorRight);\n    };\n    Selection.prototype.selectLeft = function () {\n      this.$moveSelection(this.moveCursorLeft);\n    };\n    Selection.prototype.selectLineStart = function () {\n      this.$moveSelection(this.moveCursorLineStart);\n    };\n    Selection.prototype.selectLineEnd = function () {\n      this.$moveSelection(this.moveCursorLineEnd);\n    };\n    Selection.prototype.selectFileEnd = function () {\n      this.$moveSelection(this.moveCursorFileEnd);\n    };\n    Selection.prototype.selectFileStart = function () {\n      this.$moveSelection(this.moveCursorFileStart);\n    };\n    Selection.prototype.selectWordRight = function () {\n      this.$moveSelection(this.moveCursorWordRight);\n    };\n    Selection.prototype.selectWordLeft = function () {\n      this.$moveSelection(this.moveCursorWordLeft);\n    };\n    Selection.prototype.getWordRange = function (row, column) {\n      if (typeof column == \"undefined\") {\n        var cursor = row || this.lead;\n        row = cursor.row;\n        column = cursor.column;\n      }\n      return this.session.getWordRange(row, column);\n    };\n    Selection.prototype.selectWord = function () {\n      this.setSelectionRange(this.getWordRange());\n    };\n    Selection.prototype.selectAWord = function () {\n      var cursor = this.getCursor();\n      var range = this.session.getAWordRange(cursor.row, cursor.column);\n      this.setSelectionRange(range);\n    };\n    Selection.prototype.getLineRange = function (row, excludeLastChar) {\n      var rowStart = typeof row == \"number\" ? row : this.lead.row;\n      var rowEnd;\n      var foldLine = this.session.getFoldLine(rowStart);\n      if (foldLine) {\n        rowStart = foldLine.start.row;\n        rowEnd = foldLine.end.row;\n      } else {\n        rowEnd = rowStart;\n      }\n      if (excludeLastChar === true)\n        return new Range(\n          rowStart,\n          0,\n          rowEnd,\n          this.session.getLine(rowEnd).length,\n        );\n      else return new Range(rowStart, 0, rowEnd + 1, 0);\n    };\n    Selection.prototype.selectLine = function () {\n      this.setSelectionRange(this.getLineRange());\n    };\n    Selection.prototype.moveCursorUp = function () {\n      this.moveCursorBy(-1, 0);\n    };\n    Selection.prototype.moveCursorDown = function () {\n      this.moveCursorBy(1, 0);\n    };\n    Selection.prototype.wouldMoveIntoSoftTab = function (\n      cursor,\n      tabSize,\n      direction,\n    ) {\n      var start = cursor.column;\n      var end = cursor.column + tabSize;\n      if (direction < 0) {\n        start = cursor.column - tabSize;\n        end = cursor.column;\n      }\n      return (\n        this.session.isTabStop(cursor) &&\n        this.doc.getLine(cursor.row).slice(start, end).split(\" \").length - 1 ==\n          tabSize\n      );\n    };\n    Selection.prototype.moveCursorLeft = function () {\n      var cursor = this.lead.getPosition(),\n        fold;\n      if ((fold = this.session.getFoldAt(cursor.row, cursor.column, -1))) {\n        this.moveCursorTo(fold.start.row, fold.start.column);\n      } else if (cursor.column === 0) {\n        if (cursor.row > 0) {\n          this.moveCursorTo(\n            cursor.row - 1,\n            this.doc.getLine(cursor.row - 1).length,\n          );\n        }\n      } else {\n        var tabSize = this.session.getTabSize();\n        if (\n          this.wouldMoveIntoSoftTab(cursor, tabSize, -1) &&\n          !this.session.getNavigateWithinSoftTabs()\n        ) {\n          this.moveCursorBy(0, -tabSize);\n        } else {\n          this.moveCursorBy(0, -1);\n        }\n      }\n    };\n    Selection.prototype.moveCursorRight = function () {\n      var cursor = this.lead.getPosition(),\n        fold;\n      if ((fold = this.session.getFoldAt(cursor.row, cursor.column, 1))) {\n        this.moveCursorTo(fold.end.row, fold.end.column);\n      } else if (this.lead.column == this.doc.getLine(this.lead.row).length) {\n        if (this.lead.row < this.doc.getLength() - 1) {\n          this.moveCursorTo(this.lead.row + 1, 0);\n        }\n      } else {\n        var tabSize = this.session.getTabSize();\n        var cursor = this.lead;\n        if (\n          this.wouldMoveIntoSoftTab(cursor, tabSize, 1) &&\n          !this.session.getNavigateWithinSoftTabs()\n        ) {\n          this.moveCursorBy(0, tabSize);\n        } else {\n          this.moveCursorBy(0, 1);\n        }\n      }\n    };\n    Selection.prototype.moveCursorLineStart = function () {\n      var row = this.lead.row;\n      var column = this.lead.column;\n      var screenRow = this.session.documentToScreenRow(row, column);\n      var firstColumnPosition = this.session.screenToDocumentPosition(\n        screenRow,\n        0,\n      );\n      var beforeCursor = this.session.getDisplayLine(\n        row,\n        null,\n        firstColumnPosition.row,\n        firstColumnPosition.column,\n      );\n      var leadingSpace = beforeCursor.match(/^\\s*/);\n      if (\n        leadingSpace[0].length != column &&\n        !this.session.$useEmacsStyleLineStart\n      )\n        firstColumnPosition.column += leadingSpace[0].length;\n      this.moveCursorToPosition(firstColumnPosition);\n    };\n    Selection.prototype.moveCursorLineEnd = function () {\n      var lead = this.lead;\n      var lineEnd = this.session.getDocumentLastRowColumnPosition(\n        lead.row,\n        lead.column,\n      );\n      if (this.lead.column == lineEnd.column) {\n        var line = this.session.getLine(lineEnd.row);\n        if (lineEnd.column == line.length) {\n          var textEnd = line.search(/\\s+$/);\n          if (textEnd > 0) lineEnd.column = textEnd;\n        }\n      }\n      this.moveCursorTo(lineEnd.row, lineEnd.column);\n    };\n    Selection.prototype.moveCursorFileEnd = function () {\n      var row = this.doc.getLength() - 1;\n      var column = this.doc.getLine(row).length;\n      this.moveCursorTo(row, column);\n    };\n    Selection.prototype.moveCursorFileStart = function () {\n      this.moveCursorTo(0, 0);\n    };\n    Selection.prototype.moveCursorLongWordRight = function () {\n      var row = this.lead.row;\n      var column = this.lead.column;\n      var line = this.doc.getLine(row);\n      var rightOfCursor = line.substring(column);\n      this.session.nonTokenRe.lastIndex = 0;\n      this.session.tokenRe.lastIndex = 0;\n      var fold = this.session.getFoldAt(row, column, 1);\n      if (fold) {\n        this.moveCursorTo(fold.end.row, fold.end.column);\n        return;\n      }\n      if (this.session.nonTokenRe.exec(rightOfCursor)) {\n        column += this.session.nonTokenRe.lastIndex;\n        this.session.nonTokenRe.lastIndex = 0;\n        rightOfCursor = line.substring(column);\n      }\n      if (column >= line.length) {\n        this.moveCursorTo(row, line.length);\n        this.moveCursorRight();\n        if (row < this.doc.getLength() - 1) this.moveCursorWordRight();\n        return;\n      }\n      if (this.session.tokenRe.exec(rightOfCursor)) {\n        column += this.session.tokenRe.lastIndex;\n        this.session.tokenRe.lastIndex = 0;\n      }\n      this.moveCursorTo(row, column);\n    };\n    Selection.prototype.moveCursorLongWordLeft = function () {\n      var row = this.lead.row;\n      var column = this.lead.column;\n      var fold;\n      if ((fold = this.session.getFoldAt(row, column, -1))) {\n        this.moveCursorTo(fold.start.row, fold.start.column);\n        return;\n      }\n      var str = this.session.getFoldStringAt(row, column, -1);\n      if (str == null) {\n        str = this.doc.getLine(row).substring(0, column);\n      }\n      var leftOfCursor = lang.stringReverse(str);\n      this.session.nonTokenRe.lastIndex = 0;\n      this.session.tokenRe.lastIndex = 0;\n      if (this.session.nonTokenRe.exec(leftOfCursor)) {\n        column -= this.session.nonTokenRe.lastIndex;\n        leftOfCursor = leftOfCursor.slice(this.session.nonTokenRe.lastIndex);\n        this.session.nonTokenRe.lastIndex = 0;\n      }\n      if (column <= 0) {\n        this.moveCursorTo(row, 0);\n        this.moveCursorLeft();\n        if (row > 0) this.moveCursorWordLeft();\n        return;\n      }\n      if (this.session.tokenRe.exec(leftOfCursor)) {\n        column -= this.session.tokenRe.lastIndex;\n        this.session.tokenRe.lastIndex = 0;\n      }\n      this.moveCursorTo(row, column);\n    };\n    Selection.prototype.$shortWordEndIndex = function (rightOfCursor) {\n      var index = 0,\n        ch;\n      var whitespaceRe = /\\s/;\n      var tokenRe = this.session.tokenRe;\n      tokenRe.lastIndex = 0;\n      if (this.session.tokenRe.exec(rightOfCursor)) {\n        index = this.session.tokenRe.lastIndex;\n      } else {\n        while ((ch = rightOfCursor[index]) && whitespaceRe.test(ch)) index++;\n        if (index < 1) {\n          tokenRe.lastIndex = 0;\n          while ((ch = rightOfCursor[index]) && !tokenRe.test(ch)) {\n            tokenRe.lastIndex = 0;\n            index++;\n            if (whitespaceRe.test(ch)) {\n              if (index > 2) {\n                index--;\n                break;\n              } else {\n                while ((ch = rightOfCursor[index]) && whitespaceRe.test(ch))\n                  index++;\n                if (index > 2) break;\n              }\n            }\n          }\n        }\n      }\n      tokenRe.lastIndex = 0;\n      return index;\n    };\n    Selection.prototype.moveCursorShortWordRight = function () {\n      var row = this.lead.row;\n      var column = this.lead.column;\n      var line = this.doc.getLine(row);\n      var rightOfCursor = line.substring(column);\n      var fold = this.session.getFoldAt(row, column, 1);\n      if (fold) return this.moveCursorTo(fold.end.row, fold.end.column);\n      if (column == line.length) {\n        var l = this.doc.getLength();\n        do {\n          row++;\n          rightOfCursor = this.doc.getLine(row);\n        } while (row < l && /^\\s*$/.test(rightOfCursor));\n        if (!/^\\s+/.test(rightOfCursor)) rightOfCursor = \"\";\n        column = 0;\n      }\n      var index = this.$shortWordEndIndex(rightOfCursor);\n      this.moveCursorTo(row, column + index);\n    };\n    Selection.prototype.moveCursorShortWordLeft = function () {\n      var row = this.lead.row;\n      var column = this.lead.column;\n      var fold;\n      if ((fold = this.session.getFoldAt(row, column, -1)))\n        return this.moveCursorTo(fold.start.row, fold.start.column);\n      var line = this.session.getLine(row).substring(0, column);\n      if (column === 0) {\n        do {\n          row--;\n          line = this.doc.getLine(row);\n        } while (row > 0 && /^\\s*$/.test(line));\n        column = line.length;\n        if (!/\\s+$/.test(line)) line = \"\";\n      }\n      var leftOfCursor = lang.stringReverse(line);\n      var index = this.$shortWordEndIndex(leftOfCursor);\n      return this.moveCursorTo(row, column - index);\n    };\n    Selection.prototype.moveCursorWordRight = function () {\n      if (this.session.$selectLongWords) this.moveCursorLongWordRight();\n      else this.moveCursorShortWordRight();\n    };\n    Selection.prototype.moveCursorWordLeft = function () {\n      if (this.session.$selectLongWords) this.moveCursorLongWordLeft();\n      else this.moveCursorShortWordLeft();\n    };\n    Selection.prototype.moveCursorBy = function (rows, chars) {\n      var screenPos = this.session.documentToScreenPosition(\n        this.lead.row,\n        this.lead.column,\n      );\n      var offsetX;\n      if (chars === 0) {\n        if (rows !== 0) {\n          if (\n            this.session.$bidiHandler.isBidiRow(screenPos.row, this.lead.row)\n          ) {\n            offsetX = this.session.$bidiHandler.getPosLeft(screenPos.column);\n            screenPos.column = Math.round(\n              offsetX / this.session.$bidiHandler.charWidths[0],\n            );\n          } else {\n            offsetX =\n              screenPos.column * this.session.$bidiHandler.charWidths[0];\n          }\n        }\n        if (this.$desiredColumn) screenPos.column = this.$desiredColumn;\n        else this.$desiredColumn = screenPos.column;\n      }\n      if (\n        rows != 0 &&\n        this.session.lineWidgets &&\n        this.session.lineWidgets[this.lead.row]\n      ) {\n        var widget = this.session.lineWidgets[this.lead.row];\n        if (rows < 0) rows -= widget.rowsAbove || 0;\n        else if (rows > 0) rows += widget.rowCount - (widget.rowsAbove || 0);\n      }\n      var docPos = this.session.screenToDocumentPosition(\n        screenPos.row + rows,\n        screenPos.column,\n        offsetX,\n      );\n      if (\n        rows !== 0 &&\n        chars === 0 &&\n        docPos.row === this.lead.row &&\n        docPos.column === this.lead.column\n      ) {\n      }\n      this.moveCursorTo(docPos.row, docPos.column + chars, chars === 0);\n    };\n    Selection.prototype.moveCursorToPosition = function (position) {\n      this.moveCursorTo(position.row, position.column);\n    };\n    Selection.prototype.moveCursorTo = function (\n      row,\n      column,\n      keepDesiredColumn,\n    ) {\n      var fold = this.session.getFoldAt(row, column, 1);\n      if (fold) {\n        row = fold.start.row;\n        column = fold.start.column;\n      }\n      this.$keepDesiredColumnOnChange = true;\n      var line = this.session.getLine(row);\n      if (\n        /[\\uDC00-\\uDFFF]/.test(line.charAt(column)) &&\n        line.charAt(column - 1)\n      ) {\n        if (this.lead.row == row && this.lead.column == column + 1)\n          column = column - 1;\n        else column = column + 1;\n      }\n      this.lead.setPosition(row, column);\n      this.$keepDesiredColumnOnChange = false;\n      if (!keepDesiredColumn) this.$desiredColumn = null;\n    };\n    Selection.prototype.moveCursorToScreen = function (\n      row,\n      column,\n      keepDesiredColumn,\n    ) {\n      var pos = this.session.screenToDocumentPosition(row, column);\n      this.moveCursorTo(pos.row, pos.column, keepDesiredColumn);\n    };\n    Selection.prototype.detach = function () {\n      this.lead.detach();\n      this.anchor.detach();\n    };\n    Selection.prototype.fromOrientedRange = function (range) {\n      this.setSelectionRange(range, range.cursor == range.start);\n      this.$desiredColumn = range.desiredColumn || this.$desiredColumn;\n    };\n    Selection.prototype.toOrientedRange = function (range) {\n      var r = this.getRange();\n      if (range) {\n        range.start.column = r.start.column;\n        range.start.row = r.start.row;\n        range.end.column = r.end.column;\n        range.end.row = r.end.row;\n      } else {\n        range = r;\n      }\n      range.cursor = this.isBackwards() ? range.start : range.end;\n      range.desiredColumn = this.$desiredColumn;\n      return range;\n    };\n    Selection.prototype.getRangeOfMovements = function (func) {\n      var start = this.getCursor();\n      try {\n        func(this);\n        var end = this.getCursor();\n        return Range.fromPoints(start, end);\n      } catch (e) {\n        return Range.fromPoints(start, start);\n      } finally {\n        this.moveCursorToPosition(start);\n      }\n    };\n    Selection.prototype.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    Selection.prototype.fromJSON = function (data) {\n      if (data.start == undefined) {\n        if (this.rangeList && data.length > 1) {\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[i].isBackwards) r.cursor = r.start;\n            this.addRange(r, true);\n          }\n          return;\n        } else {\n          data = data[0];\n        }\n      }\n      if (this.rangeList) this.toSingleRange(data);\n      this.setSelectionRange(data, data.isBackwards);\n    };\n    Selection.prototype.isEqual = function (data) {\n      if ((data.length || this.rangeCount) && data.length != this.rangeCount)\n        return false;\n      if (!data.length || !this.ranges) return this.getRange().isEqual(data);\n      for (var i = this.ranges.length; i--; ) {\n        if (!this.ranges[i].isEqual(data[i])) return false;\n      }\n      return true;\n    };\n    return Selection;\n  })();\n  Selection.prototype.setSelectionAnchor = Selection.prototype.setAnchor;\n  Selection.prototype.getSelectionAnchor = Selection.prototype.getAnchor;\n  Selection.prototype.setSelectionRange = Selection.prototype.setRange;\n  oop.implement(Selection.prototype, EventEmitter);\n  exports.Selection = Selection;\n});\n\ndefine(\"ace/tokenizer\", [\n  \"require\",\n  \"exports\",\n  \"module\",\n  \"ace/lib/report_error\",\n], function (require, exports, module) {\n  \"use strict\";\n  var reportError = require(\"./lib/report_error\").reportError;\n  var MAX_TOKEN_COUNT = 2000;\n  var Tokenizer = /** @class */ (function () {\n    function Tokenizer(rules) {\n      this.splitRegex;\n      this.states = rules;\n      this.regExps = {};\n      this.matchMappings = {};\n      for (var key in this.states) {\n        var state = this.states[key];\n        var ruleRegExps = [];\n        var matchTotal = 0;\n        var mapping = (this.matchMappings[key] = { defaultToken: \"text\" });\n        var flag = \"g\";\n        var splitterRurles = [];\n        for (var i = 0; i < state.length; i++) {\n          var rule = state[i];\n          if (rule.defaultToken) mapping.defaultToken = rule.defaultToken;\n          if (rule.caseInsensitive && flag.indexOf(\"i\") === -1) flag += \"i\";\n          if (rule.unicode && flag.indexOf(\"u\") === -1) flag += \"u\";\n          if (rule.regex == null) continue;\n          if (rule.regex instanceof RegExp)\n            rule.regex = rule.regex.toString().slice(1, -1);\n          var adjustedregex = rule.regex;\n          var matchcount =\n            new RegExp(\"(?:(\" + adjustedregex + \")|(.))\").exec(\"a\").length - 2;\n          if (Array.isArray(rule.token)) {\n            if (rule.token.length == 1 || matchcount == 1) {\n              rule.token = rule.token[0];\n            } else if (matchcount - 1 != rule.token.length) {\n              this.reportError(\n                \"number of classes and regexp groups doesn't match\",\n                {\n                  rule: rule,\n                  groupCount: matchcount - 1,\n                },\n              );\n              rule.token = rule.token[0];\n            } else {\n              rule.tokenArray = rule.token;\n              rule.token = null;\n              rule.onMatch = this.$arrayTokens;\n            }\n          } else if (typeof rule.token == \"function\" && !rule.onMatch) {\n            if (matchcount > 1) rule.onMatch = this.$applyToken;\n            else rule.onMatch = rule.token;\n          }\n          if (matchcount > 1) {\n            if (/\\\\\\d/.test(rule.regex)) {\n              adjustedregex = rule.regex.replace(\n                /\\\\([0-9]+)/g,\n                function (match, digit) {\n                  return \"\\\\\" + (parseInt(digit, 10) + matchTotal + 1);\n                },\n              );\n            } else {\n              matchcount = 1;\n              adjustedregex = this.removeCapturingGroups(rule.regex);\n            }\n            if (!rule.splitRegex && typeof rule.token != \"string\")\n              splitterRurles.push(rule); // flag will be known only at the very end\n          }\n          mapping[matchTotal] = i;\n          matchTotal += matchcount;\n          ruleRegExps.push(adjustedregex);\n          if (!rule.onMatch) rule.onMatch = null;\n        }\n        if (!ruleRegExps.length) {\n          mapping[0] = 0;\n          ruleRegExps.push(\"$\");\n        }\n        splitterRurles.forEach(function (rule) {\n          rule.splitRegex = this.createSplitterRegexp(rule.regex, flag);\n        }, this);\n        this.regExps[key] = new RegExp(\n          \"(\" + ruleRegExps.join(\")|(\") + \")|($)\",\n          flag,\n        );\n      }\n    }\n    Tokenizer.prototype.$setMaxTokenCount = function (m) {\n      MAX_TOKEN_COUNT = m | 0;\n    };\n    Tokenizer.prototype.$applyToken = function (str) {\n      var values = this.splitRegex.exec(str).slice(1);\n      var types = this.token.apply(this, values);\n      if (typeof types === \"string\") return [{ type: types, value: str }];\n      var tokens = [];\n      for (var i = 0, l = types.length; i < l; i++) {\n        if (values[i])\n          tokens[tokens.length] = {\n            type: types[i],\n            value: values[i],\n          };\n      }\n      return tokens;\n    };\n    Tokenizer.prototype.$arrayTokens = function (str) {\n      if (!str) return [];\n      var values = this.splitRegex.exec(str);\n      if (!values) return \"text\";\n      var tokens = [];\n      var types = this.tokenArray;\n      for (var i = 0, l = types.length; i < l; i++) {\n        if (values[i + 1])\n          tokens[tokens.length] = {\n            type: types[i],\n            value: values[i + 1],\n          };\n      }\n      return tokens;\n    };\n    Tokenizer.prototype.removeCapturingGroups = function (src) {\n      var r = src.replace(\n        /\\\\.|\\[(?:\\\\.|[^\\\\\\]])*|\\(\\?[:=!<]|(\\()/g,\n        function (x, y) {\n          return y ? \"(?:\" : x;\n        },\n      );\n      return r;\n    };\n    Tokenizer.prototype.createSplitterRegexp = function (src, flag) {\n      if (src.indexOf(\"(?=\") != -1) {\n        var stack = 0;\n        var inChClass = false;\n        var lastCapture = {};\n        src.replace(\n          /(\\\\.)|(\\((?:\\?[=!])?)|(\\))|([\\[\\]])/g,\n          function (m, esc, parenOpen, parenClose, square, index) {\n            if (inChClass) {\n              inChClass = square != \"]\";\n            } else if (square) {\n              inChClass = true;\n            } else if (parenClose) {\n              if (stack == lastCapture.stack) {\n                lastCapture.end = index + 1;\n                lastCapture.stack = -1;\n              }\n              stack--;\n            } else if (parenOpen) {\n              stack++;\n              if (parenOpen.length != 1) {\n                lastCapture.stack = stack;\n                lastCapture.start = index;\n              }\n            }\n            return m;\n          },\n        );\n        if (\n          lastCapture.end != null &&\n          /^\\)*$/.test(src.substr(lastCapture.end))\n        )\n          src =\n            src.substring(0, lastCapture.start) + src.substr(lastCapture.end);\n      }\n      if (src.charAt(0) != \"^\") src = \"^\" + src;\n      if (src.charAt(src.length - 1) != \"$\") src += \"$\";\n      return new RegExp(src, (flag || \"\").replace(\"g\", \"\"));\n    };\n    Tokenizer.prototype.getLineTokens = function (line, startState) {\n      if (startState && typeof startState != \"string\") {\n        var stack = startState.slice(0);\n        startState = stack[0];\n        if (startState === \"#tmp\") {\n          stack.shift();\n          startState = stack.shift();\n        }\n      } else var stack = [];\n      var currentState = /**@type{string}*/ (startState) || \"start\";\n      var state = this.states[currentState];\n      if (!state) {\n        currentState = \"start\";\n        state = this.states[currentState];\n      }\n      var mapping = this.matchMappings[currentState];\n      var re = this.regExps[currentState];\n      re.lastIndex = 0;\n      var match,\n        tokens = [];\n      var lastIndex = 0;\n      var matchAttempts = 0;\n      var token = { type: null, value: \"\" };\n      while ((match = re.exec(line))) {\n        var type = mapping.defaultToken;\n        var rule = null;\n        var value = match[0];\n        var index = re.lastIndex;\n        if (index - value.length > lastIndex) {\n          var skipped = line.substring(lastIndex, index - value.length);\n          if (token.type == type) {\n            token.value += skipped;\n          } else {\n            if (token.type) tokens.push(token);\n            token = { type: type, value: skipped };\n          }\n        }\n        for (var i = 0; i < match.length - 2; i++) {\n          if (match[i + 1] === undefined) continue;\n          rule = state[mapping[i]];\n          if (rule.onMatch)\n            type = rule.onMatch(value, currentState, stack, line);\n          else type = rule.token;\n          if (rule.next) {\n            if (typeof rule.next == \"string\") {\n              currentState = rule.next;\n            } else {\n              currentState = rule.next(currentState, stack);\n            }\n            state = this.states[currentState];\n            if (!state) {\n              this.reportError(\"state doesn't exist\", currentState);\n              currentState = \"start\";\n              state = this.states[currentState];\n            }\n            mapping = this.matchMappings[currentState];\n            lastIndex = index;\n            re = this.regExps[currentState];\n            re.lastIndex = index;\n          }\n          if (rule.consumeLineEnd) lastIndex = index;\n          break;\n        }\n        if (value) {\n          if (typeof type === \"string\") {\n            if ((!rule || rule.merge !== false) && token.type === type) {\n              token.value += value;\n            } else {\n              if (token.type) tokens.push(token);\n              token = { type: type, value: value };\n            }\n          } else if (type) {\n            if (token.type) tokens.push(token);\n            token = { type: null, value: \"\" };\n            for (var i = 0; i < type.length; i++) tokens.push(type[i]);\n          }\n        }\n        if (lastIndex == line.length) break;\n        lastIndex = index;\n        if (matchAttempts++ > MAX_TOKEN_COUNT) {\n          if (matchAttempts > 2 * line.length) {\n            this.reportError(\"infinite loop with in ace tokenizer\", {\n              startState: startState,\n              line: line,\n            });\n          }\n          while (lastIndex < line.length) {\n            if (token.type) tokens.push(token);\n            token = {\n              value: line.substring(lastIndex, (lastIndex += 500)),\n              type: \"overflow\",\n            };\n          }\n          currentState = \"start\";\n          stack = [];\n          break;\n        }\n      }\n      if (token.type) tokens.push(token);\n      if (stack.length > 1) {\n        if (stack[0] !== currentState) stack.unshift(\"#tmp\", currentState);\n      }\n      return {\n        tokens: tokens,\n        state: stack.length ? stack : currentState,\n      };\n    };\n    return Tokenizer;\n  })();\n  Tokenizer.prototype.reportError = reportError;\n  exports.Tokenizer = Tokenizer;\n});\n\ndefine(\"ace/mode/text_highlight_rules\", [\n  \"require\",\n  \"exports\",\n  \"module\",\n  \"ace/lib/deep_copy\",\n], function (require, exports, module) {\n  \"use strict\";\n  var deepCopy = require(\"../lib/deep_copy\").deepCopy;\n  var TextHighlightRules;\n  TextHighlightRules = function () {\n    this.$rules = {\n      start: [\n        {\n          token: \"empty_line\",\n          regex: \"^$\",\n        },\n        {\n          defaultToken: \"text\",\n        },\n      ],\n    };\n  };\n  (function () {\n    this.addRules = function (rules, prefix) {\n      if (!prefix) {\n        for (var key in rules) 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 || rule.onMatch) {\n            if (typeof rule.next == \"string\") {\n              if (rule.next.indexOf(prefix) !== 0)\n                rule.next = prefix + rule.next;\n            }\n            if (rule.nextState && rule.nextState.indexOf(prefix) !== 0)\n              rule.nextState = prefix + rule.nextState;\n          }\n        }\n        this.$rules[prefix + key] = state;\n      }\n    };\n    this.getRules = function () {\n      return this.$rules;\n    };\n    this.embedRules = function (\n      HighlightRules,\n      prefix,\n      escapeRules,\n      states,\n      append,\n    ) {\n      var embedRules =\n        typeof HighlightRules == \"function\"\n          ? new HighlightRules().getRules()\n          : HighlightRules;\n      if (states) {\n        for (var i = 0; i < states.length; i++) states[i] = prefix + states[i];\n      } else {\n        states = [];\n        for (var key in embedRules) states.push(prefix + key);\n      }\n      this.addRules(embedRules, prefix);\n      if (escapeRules) {\n        var addRules = Array.prototype[append ? \"push\" : \"unshift\"];\n        for (var i = 0; i < states.length; i++)\n          addRules.apply(this.$rules[states[i]], deepCopy(escapeRules));\n      }\n      if (!this.$embeds) this.$embeds = [];\n      this.$embeds.push(prefix);\n    };\n    this.getEmbeds = function () {\n      return this.$embeds;\n    };\n    var pushState = function (currentState, stack) {\n      if (currentState != \"start\" || stack.length)\n        stack.unshift(this.nextState, currentState);\n      return this.nextState;\n    };\n    var popState = function (currentState, stack) {\n      stack.shift();\n      return stack.shift() || \"start\";\n    };\n    this.normalizeRules = function () {\n      var id = 0;\n      var rules = this.$rules;\n      function processState(key) {\n        var state = rules[key];\n        state[\"processed\"] = true;\n        for (var i = 0; i < state.length; i++) {\n          var rule = state[i];\n          var toInsert = null;\n          if (Array.isArray(rule)) {\n            toInsert = rule;\n            rule = {};\n          }\n          if (!rule.regex && rule.start) {\n            rule.regex = rule.start;\n            if (!rule.next) rule.next = [];\n            rule.next.push(\n              {\n                defaultToken: rule.token,\n              },\n              {\n                token: rule.token + \".end\",\n                regex: rule.end || rule.start,\n                next: \"pop\",\n              },\n            );\n            rule.token = rule.token + \".start\";\n            rule.push = true;\n          }\n          var next = rule.next || rule.push;\n          if (next && Array.isArray(next)) {\n            var stateName = rule.stateName;\n            if (!stateName) {\n              stateName = rule.token;\n              if (typeof stateName != \"string\") stateName = stateName[0] || \"\";\n              if (rules[stateName]) stateName += id++;\n            }\n            rules[stateName] = next;\n            rule.next = stateName;\n            processState(stateName);\n          } else if (next == \"pop\") {\n            rule.next = popState;\n          }\n          if (rule.push) {\n            rule.nextState = rule.next || rule.push;\n            rule.next = pushState;\n            delete rule.push;\n          }\n          if (rule.rules) {\n            for (var r in rule.rules) {\n              if (rules[r]) {\n                if (rules[r].push) rules[r].push.apply(rules[r], rule.rules[r]);\n              } else {\n                rules[r] = rule.rules[r];\n              }\n            }\n          }\n          var includeName = typeof rule == \"string\" ? rule : rule.include;\n          if (includeName) {\n            if (includeName === \"$self\") includeName = \"start\";\n            if (Array.isArray(includeName))\n              toInsert = includeName.map(function (x) {\n                return rules[x];\n              });\n            else toInsert = rules[includeName];\n          }\n          if (toInsert) {\n            var args = [i, 1].concat(toInsert);\n            if (rule.noEscape)\n              args = args.filter(function (x) {\n                return !x.next;\n              });\n            state.splice.apply(state, args);\n            i--;\n          }\n          if (rule.keywordMap) {\n            rule.token = this.createKeywordMapper(\n              rule.keywordMap,\n              rule.defaultToken || \"text\",\n              rule.caseInsensitive,\n            );\n            delete rule.defaultToken;\n          }\n        }\n      }\n      Object.keys(rules).forEach(processState, this);\n    };\n    this.createKeywordMapper = function (\n      map,\n      defaultToken,\n      ignoreCase,\n      splitChar,\n    ) {\n      var keywords = Object.create(null);\n      this.$keywordList = [];\n      Object.keys(map).forEach(function (className) {\n        var a = map[className];\n        var list = a.split(splitChar || \"|\");\n        for (var i = list.length; i--; ) {\n          var word = list[i];\n          this.$keywordList.push(word);\n          if (ignoreCase) word = word.toLowerCase();\n          keywords[word] = className;\n        }\n      }, this);\n      map = null;\n      return ignoreCase\n        ? function (value) {\n            return keywords[value.toLowerCase()] || defaultToken;\n          }\n        : function (value) {\n            return keywords[value] || defaultToken;\n          };\n    };\n    this.getKeywords = function () {\n      return this.$keywords;\n    };\n  }).call(TextHighlightRules.prototype);\n  exports.TextHighlightRules = TextHighlightRules;\n});\n\ndefine(\"ace/mode/behaviour\", [\"require\", \"exports\", \"module\"], function (\n  require,\n  exports,\n  module,\n) {\n  \"use strict\";\n  var Behaviour;\n  Behaviour = function () {\n    this.$behaviours = {};\n  };\n  (function () {\n    this.add = function (name, action, callback) {\n      switch (undefined) {\n        case this.$behaviours:\n          this.$behaviours = {};\n        case this.$behaviours[name]:\n          this.$behaviours[name] = {};\n      }\n      this.$behaviours[name][action] = callback;\n    };\n    this.addBehaviours = function (behaviours) {\n      for (var key in behaviours) {\n        for (var action in behaviours[key]) {\n          this.add(key, action, behaviours[key][action]);\n        }\n      }\n    };\n    this.remove = function (name) {\n      if (this.$behaviours && this.$behaviours[name]) {\n        delete this.$behaviours[name];\n      }\n    };\n    this.inherit = function (mode, filter) {\n      if (typeof mode === \"function\") {\n        var behaviours = new mode().getBehaviours(filter);\n      } else {\n        var behaviours = mode.getBehaviours(filter);\n      }\n      this.addBehaviours(behaviours);\n    };\n    this.getBehaviours = function (filter) {\n      if (!filter) {\n        return this.$behaviours;\n      } else {\n        var ret = {};\n        for (var i = 0; i < filter.length; i++) {\n          if (this.$behaviours[filter[i]]) {\n            ret[filter[i]] = this.$behaviours[filter[i]];\n          }\n        }\n        return ret;\n      }\n    };\n  }).call(Behaviour.prototype);\n  exports.Behaviour = Behaviour;\n});\n\ndefine(\"ace/token_iterator\", [\n  \"require\",\n  \"exports\",\n  \"module\",\n  \"ace/range\",\n], function (require, exports, module) {\n  \"use strict\";\n  var Range = require(\"./range\").Range;\n  var TokenIterator = /** @class */ (function () {\n    function TokenIterator(session, initialRow, initialColumn) {\n      this.$session = session;\n      this.$row = initialRow;\n      this.$rowTokens = session.getTokens(initialRow);\n      var token = session.getTokenAt(initialRow, initialColumn);\n      this.$tokenIndex = token ? token.index : -1;\n    }\n    TokenIterator.prototype.stepBackward = function () {\n      this.$tokenIndex -= 1;\n      while (this.$tokenIndex < 0) {\n        this.$row -= 1;\n        if (this.$row < 0) {\n          this.$row = 0;\n          return null;\n        }\n        this.$rowTokens = this.$session.getTokens(this.$row);\n        this.$tokenIndex = this.$rowTokens.length - 1;\n      }\n      return this.$rowTokens[this.$tokenIndex];\n    };\n    TokenIterator.prototype.stepForward = function () {\n      this.$tokenIndex += 1;\n      var rowCount;\n      while (this.$tokenIndex >= this.$rowTokens.length) {\n        this.$row += 1;\n        if (!rowCount) rowCount = this.$session.getLength();\n        if (this.$row >= rowCount) {\n          this.$row = rowCount - 1;\n          return null;\n        }\n        this.$rowTokens = this.$session.getTokens(this.$row);\n        this.$tokenIndex = 0;\n      }\n      return this.$rowTokens[this.$tokenIndex];\n    };\n    TokenIterator.prototype.getCurrentToken = function () {\n      return this.$rowTokens[this.$tokenIndex];\n    };\n    TokenIterator.prototype.getCurrentTokenRow = function () {\n      return this.$row;\n    };\n    TokenIterator.prototype.getCurrentTokenColumn = function () {\n      var rowTokens = this.$rowTokens;\n      var tokenIndex = this.$tokenIndex;\n      var column = rowTokens[tokenIndex].start;\n      if (column !== undefined) return column;\n      column = 0;\n      while (tokenIndex > 0) {\n        tokenIndex -= 1;\n        column += rowTokens[tokenIndex].value.length;\n      }\n      return column;\n    };\n    TokenIterator.prototype.getCurrentTokenPosition = function () {\n      return { row: this.$row, column: this.getCurrentTokenColumn() };\n    };\n    TokenIterator.prototype.getCurrentTokenRange = function () {\n      var token = this.$rowTokens[this.$tokenIndex];\n      var column = this.getCurrentTokenColumn();\n      return new Range(\n        this.$row,\n        column,\n        this.$row,\n        column + token.value.length,\n      );\n    };\n    return TokenIterator;\n  })();\n  exports.TokenIterator = TokenIterator;\n});\n\ndefine(\"ace/mode/behaviour/cstyle\", [\n  \"require\",\n  \"exports\",\n  \"module\",\n  \"ace/lib/oop\",\n  \"ace/mode/behaviour\",\n  \"ace/token_iterator\",\n  \"ace/lib/lang\",\n], function (require, exports, module) {\n  \"use strict\";\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  var SAFE_INSERT_IN_TOKENS = [\n    \"text\",\n    \"paren.rparen\",\n    \"rparen\",\n    \"paren\",\n    \"punctuation.operator\",\n  ];\n  var SAFE_INSERT_BEFORE_TOKENS = [\n    \"text\",\n    \"paren.rparen\",\n    \"rparen\",\n    \"paren\",\n    \"punctuation.operator\",\n    \"comment\",\n  ];\n  var context;\n  var contextCache = {};\n  var defaultQuotes = { '\"': '\"', \"'\": \"'\" };\n  var initContext = function (editor) {\n    var id = -1;\n    if (editor.multiSelect) {\n      id = editor.selection.index;\n      if (contextCache.rangeCount != editor.multiSelect.rangeCount)\n        contextCache = { rangeCount: editor.multiSelect.rangeCount };\n    }\n    if (contextCache[id]) return (context = contextCache[id]);\n    context = contextCache[id] = {\n      autoInsertedBrackets: 0,\n      autoInsertedRow: -1,\n      autoInsertedLineEnd: \"\",\n      maybeInsertedBrackets: 0,\n      maybeInsertedRow: -1,\n      maybeInsertedLineStart: \"\",\n      maybeInsertedLineEnd: \"\",\n    };\n  };\n  var getWrapped = function (selection, selected, opening, closing) {\n    var rowDiff = selection.end.row - selection.start.row;\n    return {\n      text: opening + selected + closing,\n      selection: [\n        0,\n        selection.start.column + 1,\n        rowDiff,\n        selection.end.column + (rowDiff ? 0 : 1),\n      ],\n    };\n  };\n  var CstyleBehaviour;\n  CstyleBehaviour = function (options) {\n    options = options || {};\n    this.add(\n      \"braces\",\n      \"insertion\",\n      function (state, action, editor, session, text) {\n        var cursor = editor.getCursorPosition();\n        var line = session.doc.getLine(cursor.row);\n        if (text == \"{\") {\n          initContext(editor);\n          var selection = editor.getSelectionRange();\n          var selected = session.doc.getTextRange(selection);\n          if (\n            selected !== \"\" &&\n            selected !== \"{\" &&\n            editor.getWrapBehavioursEnabled()\n          ) {\n            return getWrapped(selection, selected, \"{\", \"}\");\n          } else if (CstyleBehaviour.isSaneInsertion(editor, session)) {\n            if (\n              /[\\]\\}\\)]/.test(line[cursor.column]) ||\n              editor.inMultiSelectMode ||\n              options.braces\n            ) {\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          initContext(editor);\n          var rightChar = line.substring(cursor.column, cursor.column + 1);\n          if (rightChar == \"}\") {\n            var matching = session.$findOpeningBracket(\"}\", {\n              column: cursor.column + 1,\n              row: cursor.row,\n            });\n            if (\n              matching !== null &&\n              CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)\n            ) {\n              CstyleBehaviour.popAutoInsertedClosing();\n              return {\n                text: \"\",\n                selection: [1, 1],\n              };\n            }\n          }\n        } else if (text == \"\\n\" || text == \"\\r\\n\") {\n          initContext(editor);\n          var closing = \"\";\n          if (CstyleBehaviour.isMaybeInsertedClosing(cursor, line)) {\n            closing = lang.stringRepeat(\"}\", context.maybeInsertedBrackets);\n            CstyleBehaviour.clearMaybeInsertedClosing();\n          }\n          var rightChar = line.substring(cursor.column, cursor.column + 1);\n          if (rightChar === \"}\") {\n            var openBracePos = session.findMatchingBracket(\n              { row: cursor.row, column: cursor.column + 1 },\n              \"}\",\n            );\n            if (!openBracePos) return null;\n            var next_indent = this.$getIndent(\n              session.getLine(openBracePos.row),\n            );\n          } else if (closing) {\n            var next_indent = this.$getIndent(line);\n          } else {\n            CstyleBehaviour.clearMaybeInsertedClosing();\n            return;\n          }\n          var indent = next_indent + session.getTabString();\n          return {\n            text: \"\\n\" + indent + \"\\n\" + next_indent + closing,\n            selection: [1, indent.length, 1, indent.length],\n          };\n        } else {\n          CstyleBehaviour.clearMaybeInsertedClosing();\n        }\n      },\n    );\n    this.add(\n      \"braces\",\n      \"deletion\",\n      function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == \"{\") {\n          initContext(editor);\n          var line = session.doc.getLine(range.start.row);\n          var rightChar = line.substring(\n            range.end.column,\n            range.end.column + 1,\n          );\n          if (rightChar == \"}\") {\n            range.end.column++;\n            return range;\n          } else {\n            context.maybeInsertedBrackets--;\n          }\n        }\n      },\n    );\n    this.add(\n      \"parens\",\n      \"insertion\",\n      function (state, action, editor, session, text) {\n        if (text == \"(\") {\n          initContext(editor);\n          var selection = editor.getSelectionRange();\n          var selected = session.doc.getTextRange(selection);\n          if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n            return getWrapped(selection, selected, \"(\", \")\");\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          initContext(editor);\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(\")\", {\n              column: cursor.column + 1,\n              row: cursor.row,\n            });\n            if (\n              matching !== null &&\n              CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)\n            ) {\n              CstyleBehaviour.popAutoInsertedClosing();\n              return {\n                text: \"\",\n                selection: [1, 1],\n              };\n            }\n          }\n        }\n      },\n    );\n    this.add(\n      \"parens\",\n      \"deletion\",\n      function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == \"(\") {\n          initContext(editor);\n          var line = session.doc.getLine(range.start.row);\n          var rightChar = line.substring(\n            range.start.column + 1,\n            range.start.column + 2,\n          );\n          if (rightChar == \")\") {\n            range.end.column++;\n            return range;\n          }\n        }\n      },\n    );\n    this.add(\n      \"brackets\",\n      \"insertion\",\n      function (state, action, editor, session, text) {\n        if (text == \"[\") {\n          initContext(editor);\n          var selection = editor.getSelectionRange();\n          var selected = session.doc.getTextRange(selection);\n          if (selected !== \"\" && editor.getWrapBehavioursEnabled()) {\n            return getWrapped(selection, selected, \"[\", \"]\");\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          initContext(editor);\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(\"]\", {\n              column: cursor.column + 1,\n              row: cursor.row,\n            });\n            if (\n              matching !== null &&\n              CstyleBehaviour.isAutoInsertedClosing(cursor, line, text)\n            ) {\n              CstyleBehaviour.popAutoInsertedClosing();\n              return {\n                text: \"\",\n                selection: [1, 1],\n              };\n            }\n          }\n        }\n      },\n    );\n    this.add(\n      \"brackets\",\n      \"deletion\",\n      function (state, action, editor, session, range) {\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && selected == \"[\") {\n          initContext(editor);\n          var line = session.doc.getLine(range.start.row);\n          var rightChar = line.substring(\n            range.start.column + 1,\n            range.start.column + 2,\n          );\n          if (rightChar == \"]\") {\n            range.end.column++;\n            return range;\n          }\n        }\n      },\n    );\n    this.add(\n      \"string_dquotes\",\n      \"insertion\",\n      function (state, action, editor, session, text) {\n        var quotes = session.$mode.$quotes || defaultQuotes;\n        if (text.length == 1 && quotes[text]) {\n          if (\n            this.lineCommentStart &&\n            this.lineCommentStart.indexOf(text) != -1\n          )\n            return;\n          initContext(editor);\n          var quote = text;\n          var selection = editor.getSelectionRange();\n          var selected = session.doc.getTextRange(selection);\n          if (\n            selected !== \"\" &&\n            (selected.length != 1 || !quotes[selected]) &&\n            editor.getWrapBehavioursEnabled()\n          ) {\n            return getWrapped(selection, selected, quote, quote);\n          } else if (!selected) {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var leftChar = line.substring(cursor.column - 1, cursor.column);\n            var rightChar = line.substring(cursor.column, cursor.column + 1);\n            var token = session.getTokenAt(cursor.row, cursor.column);\n            var rightToken = session.getTokenAt(cursor.row, cursor.column + 1);\n            if (leftChar == \"\\\\\" && token && /escape/.test(token.type))\n              return null;\n            var stringBefore = token && /string|escape/.test(token.type);\n            var stringAfter =\n              !rightToken || /string|escape/.test(rightToken.type);\n            var pair;\n            if (rightChar == quote) {\n              pair = stringBefore !== stringAfter;\n              if (pair && /string\\.end/.test(rightToken.type)) pair = false;\n            } else {\n              if (stringBefore && !stringAfter) return null; // wrap string with different quote\n              if (stringBefore && stringAfter) return null; // do not pair quotes inside strings\n              var wordRe = session.$mode.tokenRe;\n              wordRe.lastIndex = 0;\n              var isWordBefore = wordRe.test(leftChar);\n              wordRe.lastIndex = 0;\n              var isWordAfter = wordRe.test(rightChar);\n              var pairQuotesAfter = session.$mode.$pairQuotesAfter;\n              var shouldPairQuotes =\n                pairQuotesAfter &&\n                pairQuotesAfter[quote] &&\n                pairQuotesAfter[quote].test(leftChar);\n              if ((!shouldPairQuotes && isWordBefore) || isWordAfter)\n                return null; // before or after alphanumeric\n              if (rightChar && !/[\\s;,.})\\]\\\\]/.test(rightChar)) return null; // there is rightChar and it isn't closing\n              var charBefore = line[cursor.column - 2];\n              if (\n                leftChar == quote &&\n                (charBefore == quote || wordRe.test(charBefore))\n              )\n                return null;\n              pair = true;\n            }\n            return {\n              text: pair ? quote + quote : \"\",\n              selection: [1, 1],\n            };\n          }\n        }\n      },\n    );\n    this.add(\n      \"string_dquotes\",\n      \"deletion\",\n      function (state, action, editor, session, range) {\n        var quotes = session.$mode.$quotes || defaultQuotes;\n        var selected = session.doc.getTextRange(range);\n        if (!range.isMultiLine() && quotes.hasOwnProperty(selected)) {\n          initContext(editor);\n          var line = session.doc.getLine(range.start.row);\n          var rightChar = line.substring(\n            range.start.column + 1,\n            range.start.column + 2,\n          );\n          if (rightChar == selected) {\n            range.end.column++;\n            return range;\n          }\n        }\n      },\n    );\n    if (options.closeDocComment !== false) {\n      this.add(\n        \"doc comment end\",\n        \"insertion\",\n        function (state, action, editor, session, text) {\n          if (\n            state === \"doc-start\" &&\n            (text === \"\\n\" || text === \"\\r\\n\") &&\n            editor.selection.isEmpty()\n          ) {\n            var cursor = editor.getCursorPosition();\n            var line = session.doc.getLine(cursor.row);\n            var nextLine = session.doc.getLine(cursor.row + 1);\n            var indent = this.$getIndent(line);\n            if (/\\s*\\*/.test(nextLine)) {\n              if (/^\\s*\\*/.test(line)) {\n                return {\n                  text: text + indent + \"* \",\n                  selection: [1, 3 + indent.length, 1, 3 + indent.length],\n                };\n              } else {\n                return {\n                  text: text + indent + \" * \",\n                  selection: [1, 3 + indent.length, 1, 3 + indent.length],\n                };\n              }\n            }\n            if (/\\/\\*\\*/.test(line.substring(0, cursor.column))) {\n              return {\n                text: text + indent + \" * \" + text + \" \" + indent + \"*/\",\n                selection: [1, 4 + indent.length, 1, 4 + indent.length],\n              };\n            }\n          }\n        },\n      );\n    }\n  };\n  CstyleBehaviour.isSaneInsertion = function (editor, session) {\n    var cursor = editor.getCursorPosition();\n    var iterator = new TokenIterator(session, cursor.row, cursor.column);\n    if (\n      !this.$matchTokenType(\n        iterator.getCurrentToken() || \"text\",\n        SAFE_INSERT_IN_TOKENS,\n      )\n    ) {\n      if (/[)}\\]]/.test(editor.session.getLine(cursor.row)[cursor.column]))\n        return true;\n      var iterator2 = new TokenIterator(session, cursor.row, cursor.column + 1);\n      if (\n        !this.$matchTokenType(\n          iterator2.getCurrentToken() || \"text\",\n          SAFE_INSERT_IN_TOKENS,\n        )\n      )\n        return false;\n    }\n    iterator.stepForward();\n    return (\n      iterator.getCurrentTokenRow() !== cursor.row ||\n      this.$matchTokenType(\n        iterator.getCurrentToken() || \"text\",\n        SAFE_INSERT_BEFORE_TOKENS,\n      )\n    );\n  };\n  CstyleBehaviour[\"$matchTokenType\"] = function (token, types) {\n    return types.indexOf(token.type || token) > -1;\n  };\n  CstyleBehaviour[\"recordAutoInsert\"] = function (editor, session, bracket) {\n    var cursor = editor.getCursorPosition();\n    var line = session.doc.getLine(cursor.row);\n    if (\n      !this[\"isAutoInsertedClosing\"](\n        cursor,\n        line,\n        context.autoInsertedLineEnd[0],\n      )\n    )\n      context.autoInsertedBrackets = 0;\n    context.autoInsertedRow = cursor.row;\n    context.autoInsertedLineEnd = bracket + line.substr(cursor.column);\n    context.autoInsertedBrackets++;\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      context.maybeInsertedBrackets = 0;\n    context.maybeInsertedRow = cursor.row;\n    context.maybeInsertedLineStart = line.substr(0, cursor.column) + bracket;\n    context.maybeInsertedLineEnd = line.substr(cursor.column);\n    context.maybeInsertedBrackets++;\n  };\n  CstyleBehaviour[\"isAutoInsertedClosing\"] = function (cursor, line, bracket) {\n    return (\n      context.autoInsertedBrackets > 0 &&\n      cursor.row === context.autoInsertedRow &&\n      bracket === context.autoInsertedLineEnd[0] &&\n      line.substr(cursor.column) === context.autoInsertedLineEnd\n    );\n  };\n  CstyleBehaviour[\"isMaybeInsertedClosing\"] = function (cursor, line) {\n    return (\n      context.maybeInsertedBrackets > 0 &&\n      cursor.row === context.maybeInsertedRow &&\n      line.substr(cursor.column) === context.maybeInsertedLineEnd &&\n      line.substr(0, cursor.column) == context.maybeInsertedLineStart\n    );\n  };\n  CstyleBehaviour[\"popAutoInsertedClosing\"] = function () {\n    context.autoInsertedLineEnd = context.autoInsertedLineEnd.substr(1);\n    context.autoInsertedBrackets--;\n  };\n  CstyleBehaviour[\"clearMaybeInsertedClosing\"] = function () {\n    if (context) {\n      context.maybeInsertedBrackets = 0;\n      context.maybeInsertedRow = -1;\n    }\n  };\n  oop.inherits(CstyleBehaviour, Behaviour);\n  exports.CstyleBehaviour = CstyleBehaviour;\n});\n\ndefine(\"ace/unicode\", [\"require\", \"exports\", \"module\"], function (\n  require,\n  exports,\n  module,\n) {\n  \"use strict\";\n  var wordChars = [\n    48, 9, 8, 25, 5, 0, 2, 25, 48, 0, 11, 0, 5, 0, 6, 22, 2, 30, 2, 457, 5, 11,\n    15, 4, 8, 0, 2, 0, 18, 116, 2, 1, 3, 3, 9, 0, 2, 2, 2, 0, 2, 19, 2, 82, 2,\n    138, 2, 4, 3, 155, 12, 37, 3, 0, 8, 38, 10, 44, 2, 0, 2, 1, 2, 1, 2, 0, 9,\n    26, 6, 2, 30, 10, 7, 61, 2, 9, 5, 101, 2, 7, 3, 9, 2, 18, 3, 0, 17, 58, 3,\n    100, 15, 53, 5, 0, 6, 45, 211, 57, 3, 18, 2, 5, 3, 11, 3, 9, 2, 1, 7, 6, 2,\n    2, 2, 7, 3, 1, 3, 21, 2, 6, 2, 0, 4, 3, 3, 8, 3, 1, 3, 3, 9, 0, 5, 1, 2, 4,\n    3, 11, 16, 2, 2, 5, 5, 1, 3, 21, 2, 6, 2, 1, 2, 1, 2, 1, 3, 0, 2, 4, 5, 1,\n    3, 2, 4, 0, 8, 3, 2, 0, 8, 15, 12, 2, 2, 8, 2, 2, 2, 21, 2, 6, 2, 1, 2, 4,\n    3, 9, 2, 2, 2, 2, 3, 0, 16, 3, 3, 9, 18, 2, 2, 7, 3, 1, 3, 21, 2, 6, 2, 1,\n    2, 4, 3, 8, 3, 1, 3, 2, 9, 1, 5, 1, 2, 4, 3, 9, 2, 0, 17, 1, 2, 5, 4, 2, 2,\n    3, 4, 1, 2, 0, 2, 1, 4, 1, 4, 2, 4, 11, 5, 4, 4, 2, 2, 3, 3, 0, 7, 0, 15, 9,\n    18, 2, 2, 7, 2, 2, 2, 22, 2, 9, 2, 4, 4, 7, 2, 2, 2, 3, 8, 1, 2, 1, 7, 3, 3,\n    9, 19, 1, 2, 7, 2, 2, 2, 22, 2, 9, 2, 4, 3, 8, 2, 2, 2, 3, 8, 1, 8, 0, 2, 3,\n    3, 9, 19, 1, 2, 7, 2, 2, 2, 22, 2, 15, 4, 7, 2, 2, 2, 3, 10, 0, 9, 3, 3, 9,\n    11, 5, 3, 1, 2, 17, 4, 23, 2, 8, 2, 0, 3, 6, 4, 0, 5, 5, 2, 0, 2, 7, 19, 1,\n    14, 57, 6, 14, 2, 9, 40, 1, 2, 0, 3, 1, 2, 0, 3, 0, 7, 3, 2, 6, 2, 2, 2, 0,\n    2, 0, 3, 1, 2, 12, 2, 2, 3, 4, 2, 0, 2, 5, 3, 9, 3, 1, 35, 0, 24, 1, 7, 9,\n    12, 0, 2, 0, 2, 0, 5, 9, 2, 35, 5, 19, 2, 5, 5, 7, 2, 35, 10, 0, 58, 73, 7,\n    77, 3, 37, 11, 42, 2, 0, 4, 328, 2, 3, 3, 6, 2, 0, 2, 3, 3, 40, 2, 3, 3, 32,\n    2, 3, 3, 6, 2, 0, 2, 3, 3, 14, 2, 56, 2, 3, 3, 66, 5, 0, 33, 15, 17, 84, 13,\n    619, 3, 16, 2, 25, 6, 74, 22, 12, 2, 6, 12, 20, 12, 19, 13, 12, 2, 2, 2, 1,\n    13, 51, 3, 29, 4, 0, 5, 1, 3, 9, 34, 2, 3, 9, 7, 87, 9, 42, 6, 69, 11, 28,\n    4, 11, 5, 11, 11, 39, 3, 4, 12, 43, 5, 25, 7, 10, 38, 27, 5, 62, 2, 28, 3,\n    10, 7, 9, 14, 0, 89, 75, 5, 9, 18, 8, 13, 42, 4, 11, 71, 55, 9, 9, 4, 48,\n    83, 2, 2, 30, 14, 230, 23, 280, 3, 5, 3, 37, 3, 5, 3, 7, 2, 0, 2, 0, 2, 0,\n    2, 30, 3, 52, 2, 6, 2, 0, 4, 2, 2, 6, 4, 3, 3, 5, 5, 12, 6, 2, 2, 6, 67, 1,\n    20, 0, 29, 0, 14, 0, 17, 4, 60, 12, 5, 0, 4, 11, 18, 0, 5, 0, 3, 9, 2, 0, 4,\n    4, 7, 0, 2, 0, 2, 0, 2, 3, 2, 10, 3, 3, 6, 4, 5, 0, 53, 1, 2684, 46, 2, 46,\n    2, 132, 7, 6, 15, 37, 11, 53, 10, 0, 17, 22, 10, 6, 2, 6, 2, 6, 2, 6, 2, 6,\n    2, 6, 2, 6, 2, 6, 2, 31, 48, 0, 470, 1, 36, 5, 2, 4, 6, 1, 5, 85, 3, 1, 3,\n    2, 2, 89, 2, 3, 6, 40, 4, 93, 18, 23, 57, 15, 513, 6581, 75, 20939, 53,\n    1164, 68, 45, 3, 268, 4, 27, 21, 31, 3, 13, 13, 1, 2, 24, 9, 69, 11, 1, 38,\n    8, 3, 102, 3, 1, 111, 44, 25, 51, 13, 68, 12, 9, 7, 23, 4, 0, 5, 45, 3, 35,\n    13, 28, 4, 64, 15, 10, 39, 54, 10, 13, 3, 9, 7, 22, 4, 1, 5, 66, 25, 2, 227,\n    42, 2, 1, 3, 9, 7, 11171, 13, 22, 5, 48, 8453, 301, 3, 61, 3, 105, 39, 6,\n    13, 4, 6, 11, 2, 12, 2, 4, 2, 0, 2, 1, 2, 1, 2, 107, 34, 362, 19, 63, 3, 53,\n    41, 11, 5, 15, 17, 6, 13, 1, 25, 2, 33, 4, 2, 134, 20, 9, 8, 25, 5, 0, 2,\n    25, 12, 88, 4, 5, 3, 5, 3, 5, 3, 2,\n  ];\n  var code = 0;\n  var str = [];\n  for (var i = 0; i < wordChars.length; i += 2) {\n    str.push((code += wordChars[i]));\n    if (wordChars[i + 1]) str.push(45, (code += wordChars[i + 1]));\n  }\n  exports.wordChars = String.fromCharCode.apply(null, str);\n});\n\ndefine(\"ace/mode/text\", [\n  \"require\",\n  \"exports\",\n  \"module\",\n  \"ace/config\",\n  \"ace/tokenizer\",\n  \"ace/mode/text_highlight_rules\",\n  \"ace/mode/behaviour/cstyle\",\n  \"ace/unicode\",\n  \"ace/lib/lang\",\n  \"ace/token_iterator\",\n  \"ace/range\",\n], function (require, exports, module) {\n  \"use strict\";\n  var config = require(\"../config\");\n  var Tokenizer = require(\"../tokenizer\").Tokenizer;\n  var TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n  var CstyleBehaviour = require(\"./behaviour/cstyle\").CstyleBehaviour;\n  var unicode = require(\"../unicode\");\n  var lang = require(\"../lib/lang\");\n  var TokenIterator = require(\"../token_iterator\").TokenIterator;\n  var Range = require(\"../range\").Range;\n  var Mode;\n  Mode = function () {\n    this.HighlightRules = TextHighlightRules;\n  };\n  (function () {\n    this.$defaultBehaviour = new CstyleBehaviour();\n    this.tokenRe = new RegExp(\"^[\" + unicode.wordChars + \"\\\\$_]+\", \"g\");\n    this.nonTokenRe = new RegExp(\n      \"^(?:[^\" + unicode.wordChars + \"\\\\$_]|\\\\s])+\",\n      \"g\",\n    );\n    this.getTokenizer = function () {\n      if (!this.$tokenizer) {\n        this.$highlightRules =\n          this.$highlightRules ||\n          new this.HighlightRules(this.$highlightRuleConfig);\n        this.$tokenizer = new Tokenizer(this.$highlightRules.getRules());\n      }\n      return this.$tokenizer;\n    };\n    this.lineCommentStart = \"\";\n    this.blockComment = \"\";\n    this.toggleCommentLines = function (state, session, startRow, endRow) {\n      var doc = session.doc;\n      var ignoreBlankLines = true;\n      var shouldRemove = true;\n      var minIndent = Infinity;\n      var tabSize = session.getTabSize();\n      var insertAtTabStop = false;\n      if (!this.lineCommentStart) {\n        if (!this.blockComment) return false;\n        var lineCommentStart = this.blockComment.start;\n        var lineCommentEnd = this.blockComment.end;\n        var regexpStart = new RegExp(\n          \"^(\\\\s*)(?:\" + lang.escapeRegExp(lineCommentStart) + \")\",\n        );\n        var regexpEnd = new RegExp(\n          \"(?:\" + lang.escapeRegExp(lineCommentEnd) + \")\\\\s*$\",\n        );\n        var comment = function (line, i) {\n          if (testRemove(line, i)) return;\n          if (!ignoreBlankLines || /\\S/.test(line)) {\n            doc.insertInLine({ row: i, column: line.length }, lineCommentEnd);\n            doc.insertInLine({ row: i, column: minIndent }, lineCommentStart);\n          }\n        };\n        var uncomment = function (line, i) {\n          var m;\n          if ((m = line.match(regexpEnd)))\n            doc.removeInLine(i, line.length - m[0].length, line.length);\n          if ((m = line.match(regexpStart)))\n            doc.removeInLine(i, m[1].length, m[0].length);\n        };\n        var testRemove = function (line, row) {\n          if (regexpStart.test(line)) return true;\n          var tokens = session.getTokens(row);\n          for (var i = 0; i < tokens.length; i++) {\n            if (tokens[i].type === \"comment\") return true;\n          }\n        };\n      } else {\n        if (Array.isArray(this.lineCommentStart)) {\n          var regexpStart = this.lineCommentStart\n            .map(lang.escapeRegExp)\n            .join(\"|\");\n          var lineCommentStart = this.lineCommentStart[0];\n        } else {\n          var regexpStart = lang.escapeRegExp(this.lineCommentStart);\n          var lineCommentStart = this.lineCommentStart;\n        }\n        regexpStart = new RegExp(\"^(\\\\s*)(?:\" + regexpStart + \") ?\");\n        insertAtTabStop = session.getUseSoftTabs();\n        var uncomment = function (line, i) {\n          var m = line.match(regexpStart);\n          if (!m) return;\n          var start = m[1].length,\n            end = m[0].length;\n          if (!shouldInsertSpace(line, start, end) && m[0][end - 1] == \" \")\n            end--;\n          doc.removeInLine(i, start, end);\n        };\n        var commentWithSpace = lineCommentStart + \" \";\n        var comment = function (line, i) {\n          if (!ignoreBlankLines || /\\S/.test(line)) {\n            if (shouldInsertSpace(line, minIndent, minIndent))\n              doc.insertInLine({ row: i, column: minIndent }, commentWithSpace);\n            else\n              doc.insertInLine({ row: i, column: minIndent }, lineCommentStart);\n          }\n        };\n        var testRemove = function (line, i) {\n          return regexpStart.test(line);\n        };\n        var shouldInsertSpace = function (line, before, after) {\n          var spaces = 0;\n          while (before-- && line.charAt(before) == \" \") spaces++;\n          if (spaces % tabSize != 0) return false;\n          var spaces = 0;\n          while (line.charAt(after++) == \" \") spaces++;\n          if (tabSize > 2) return spaces % tabSize != tabSize - 1;\n          else return spaces % tabSize == 0;\n        };\n      }\n      function iter(fun) {\n        for (var i = startRow; i <= endRow; i++) fun(doc.getLine(i), i);\n      }\n      var minEmptyLength = Infinity;\n      iter(function (line, i) {\n        var indent = line.search(/\\S/);\n        if (indent !== -1) {\n          if (indent < minIndent) minIndent = indent;\n          if (shouldRemove && !testRemove(line, i)) shouldRemove = false;\n        } else if (minEmptyLength > line.length) {\n          minEmptyLength = line.length;\n        }\n      });\n      if (minIndent == Infinity) {\n        minIndent = minEmptyLength;\n        ignoreBlankLines = false;\n        shouldRemove = false;\n      }\n      if (insertAtTabStop && minIndent % tabSize != 0)\n        minIndent = Math.floor(minIndent / tabSize) * tabSize;\n      iter(shouldRemove ? uncomment : comment);\n    };\n    this.toggleBlockComment = function (state, session, range, cursor) {\n      var comment = this.blockComment;\n      if (!comment) return;\n      if (!comment.start && comment[0]) comment = comment[0];\n      var iterator = new TokenIterator(session, cursor.row, cursor.column);\n      var token = iterator.getCurrentToken();\n      var sel = session.selection;\n      var initialRange = session.selection.toOrientedRange();\n      var startRow, colDiff;\n      if (token && /comment/.test(token.type)) {\n        var startRange, endRange;\n        while (token && /comment/.test(token.type)) {\n          var i = token.value.indexOf(comment.start);\n          if (i != -1) {\n            var row = iterator.getCurrentTokenRow();\n            var column = iterator.getCurrentTokenColumn() + i;\n            startRange = new Range(\n              row,\n              column,\n              row,\n              column + comment.start.length,\n            );\n            break;\n          }\n          token = iterator.stepBackward();\n        }\n        var iterator = new TokenIterator(session, cursor.row, cursor.column);\n        var token = iterator.getCurrentToken();\n        while (token && /comment/.test(token.type)) {\n          var i = token.value.indexOf(comment.end);\n          if (i != -1) {\n            var row = iterator.getCurrentTokenRow();\n            var column = iterator.getCurrentTokenColumn() + i;\n            endRange = new Range(row, column, row, column + comment.end.length);\n            break;\n          }\n          token = iterator.stepForward();\n        }\n        if (endRange) session.remove(endRange);\n        if (startRange) {\n          session.remove(startRange);\n          startRow = startRange.start.row;\n          colDiff = -comment.start.length;\n        }\n      } else {\n        colDiff = comment.start.length;\n        startRow = range.start.row;\n        session.insert(range.end, comment.end);\n        session.insert(range.start, comment.start);\n      }\n      if (initialRange.start.row == startRow)\n        initialRange.start.column += colDiff;\n      if (initialRange.end.row == startRow) initialRange.end.column += colDiff;\n      session.selection.fromOrientedRange(initialRange);\n    };\n    this.getNextLineIndent = function (state, line, tab) {\n      return this.$getIndent(line);\n    };\n    this.checkOutdent = function (state, line, input) {\n      return false;\n    };\n    this.autoOutdent = function (state, doc, row) {};\n    this.$getIndent = function (line) {\n      return line.match(/^\\s*/)[0];\n    };\n    this.createWorker = function (session) {\n      return null;\n    };\n    this.createModeDelegates = function (mapping) {\n      this.$embeds = [];\n      this.$modes = {};\n      for (var i in mapping) {\n        if (mapping[i]) {\n          var Mode = mapping[i];\n          var id = Mode.prototype.$id;\n          var mode = config.$modes[id];\n          if (!mode) config.$modes[id] = mode = new Mode();\n          if (!config.$modes[i]) config.$modes[i] = mode;\n          this.$embeds.push(i);\n          this.$modes[i] = mode;\n        }\n      }\n      var delegations = [\n        \"toggleBlockComment\",\n        \"toggleCommentLines\",\n        \"getNextLineIndent\",\n        \"checkOutdent\",\n        \"autoOutdent\",\n        \"transformAction\",\n        \"getCompletions\",\n      ];\n      var _loop_1 = function (i) {\n        (function (scope) {\n          var functionName = delegations[i];\n          var defaultHandler = scope[functionName];\n          scope[delegations[i]] = function () {\n            return this.$delegator(functionName, arguments, defaultHandler);\n          };\n        })(this_1);\n      };\n      var this_1 = this;\n      for (var i = 0; i < delegations.length; i++) {\n        _loop_1(i);\n      }\n    };\n    this.$delegator = function (method, args, defaultHandler) {\n      var state = args[0] || \"start\";\n      if (typeof state != \"string\") {\n        if (Array.isArray(state[2])) {\n          var language = state[2][state[2].length - 1];\n          var mode = this.$modes[language];\n          if (mode)\n            return mode[method].apply(\n              mode,\n              [state[1]].concat([].slice.call(args, 1)),\n            );\n        }\n        state = state[0] || \"start\";\n      }\n      for (var i = 0; i < this.$embeds.length; i++) {\n        if (!this.$modes[this.$embeds[i]]) continue;\n        var split = state.split(this.$embeds[i]);\n        if (!split[0] && split[1]) {\n          args[0] = split[1];\n          var mode = this.$modes[this.$embeds[i]];\n          return mode[method].apply(mode, args);\n        }\n      }\n      var ret = defaultHandler.apply(this, args);\n      return defaultHandler ? ret : undefined;\n    };\n    this.transformAction = function (state, action, editor, session, param) {\n      if (this.$behaviour) {\n        var behaviours = this.$behaviour.getBehaviours();\n        for (var key in behaviours) {\n          if (behaviours[key][action]) {\n            var ret = behaviours[key][action].apply(this, arguments);\n            if (ret) {\n              return ret;\n            }\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            } else if (typeof ruleItr[r].token === \"object\") {\n              for (\n                var a = 0, aLength = ruleItr[r].token.length;\n                a < aLength;\n                a++\n              ) {\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) return this.$keywordList;\n      return completionKeywords.concat(this.$keywordList || []);\n    };\n    this.$createKeywordList = function () {\n      if (!this.$highlightRules) this.getTokenizer();\n      return (this.$keywordList = this.$highlightRules.$keywordList || []);\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    this.$id = \"ace/mode/text\";\n  }).call(Mode.prototype);\n  exports.Mode = Mode;\n});\n\ndefine(\"ace/apply_delta\", [\"require\", \"exports\", \"module\"], function (\n  require,\n  exports,\n  module,\n) {\n  \"use strict\";\n  function throwDeltaError(delta, errorText) {\n    console.log(\"Invalid Delta:\", delta);\n    throw \"Invalid Delta: \" + errorText;\n  }\n  function positionInDocument(docLines, position) {\n    return (\n      position.row >= 0 &&\n      position.row < docLines.length &&\n      position.column >= 0 &&\n      position.column <= docLines[position.row].length\n    );\n  }\n  function validateDelta(docLines, delta) {\n    if (delta.action != \"insert\" && delta.action != \"remove\")\n      throwDeltaError(delta, \"delta.action must be 'insert' or 'remove'\");\n    if (!(delta.lines instanceof Array))\n      throwDeltaError(delta, \"delta.lines must be an Array\");\n    if (!delta.start || !delta.end)\n      throwDeltaError(delta, \"delta.start/end must be an present\");\n    var start = delta.start;\n    if (!positionInDocument(docLines, delta.start))\n      throwDeltaError(delta, \"delta.start must be contained in document\");\n    var end = delta.end;\n    if (delta.action == \"remove\" && !positionInDocument(docLines, end))\n      throwDeltaError(\n        delta,\n        \"delta.end must contained in document for 'remove' actions\",\n      );\n    var numRangeRows = end.row - start.row;\n    var numRangeLastLineChars =\n      end.column - (numRangeRows == 0 ? start.column : 0);\n    if (\n      numRangeRows != delta.lines.length - 1 ||\n      delta.lines[numRangeRows].length != numRangeLastLineChars\n    )\n      throwDeltaError(delta, \"delta.range must match delta lines\");\n  }\n  exports.applyDelta = function (docLines, delta, doNotValidate) {\n    var row = delta.start.row;\n    var startColumn = delta.start.column;\n    var line = docLines[row] || \"\";\n    switch (delta.action) {\n      case \"insert\":\n        var lines = delta.lines;\n        if (lines.length === 1) {\n          docLines[row] =\n            line.substring(0, startColumn) +\n            delta.lines[0] +\n            line.substring(startColumn);\n        } else {\n          var args = [row, 1].concat(delta.lines);\n          docLines.splice.apply(docLines, args);\n          docLines[row] = line.substring(0, startColumn) + docLines[row];\n          docLines[row + delta.lines.length - 1] += line.substring(startColumn);\n        }\n        break;\n      case \"remove\":\n        var endColumn = delta.end.column;\n        var endRow = delta.end.row;\n        if (row === endRow) {\n          docLines[row] =\n            line.substring(0, startColumn) + line.substring(endColumn);\n        } else {\n          docLines.splice(\n            row,\n            endRow - row + 1,\n            line.substring(0, startColumn) +\n              docLines[endRow].substring(endColumn),\n          );\n        }\n        break;\n    }\n  };\n});\n\ndefine(\"ace/anchor\", [\n  \"require\",\n  \"exports\",\n  \"module\",\n  \"ace/lib/oop\",\n  \"ace/lib/event_emitter\",\n], function (require, exports, module) {\n  \"use strict\";\n  var oop = require(\"./lib/oop\");\n  var EventEmitter = require(\"./lib/event_emitter\").EventEmitter;\n  var Anchor = /** @class */ (function () {\n    function Anchor(doc, row, column) {\n      this.$onChange = this.onChange.bind(this);\n      this.attach(doc);\n      if (typeof row != \"number\") this.setPosition(row.row, row.column);\n      else this.setPosition(row, column);\n    }\n    Anchor.prototype.getPosition = function () {\n      return this.$clipPositionToDocument(this.row, this.column);\n    };\n    Anchor.prototype.getDocument = function () {\n      return this.document;\n    };\n    Anchor.prototype.onChange = function (delta) {\n      if (delta.start.row == delta.end.row && delta.start.row != this.row)\n        return;\n      if (delta.start.row > this.row) return;\n      var point = $getTransformedPoint(\n        delta,\n        { row: this.row, column: this.column },\n        this.$insertRight,\n      );\n      this.setPosition(point.row, point.column, true);\n    };\n    Anchor.prototype.setPosition = function (row, column, noClip) {\n      var pos;\n      if (noClip) {\n        pos = {\n          row: row,\n          column: column,\n        };\n      } else {\n        pos = this.$clipPositionToDocument(row, column);\n      }\n      if (this.row == pos.row && this.column == pos.column) return;\n      var old = {\n        row: this.row,\n        column: this.column,\n      };\n      this.row = pos.row;\n      this.column = pos.column;\n      this._signal(\"change\", {\n        old: old,\n        value: pos,\n      });\n    };\n    Anchor.prototype.detach = function () {\n      this.document.off(\"change\", this.$onChange);\n    };\n    Anchor.prototype.attach = function (doc) {\n      this.document = doc || this.document;\n      this.document.on(\"change\", this.$onChange);\n    };\n    Anchor.prototype.$clipPositionToDocument = function (row, column) {\n      var pos = {};\n      if (row >= this.document.getLength()) {\n        pos.row = Math.max(0, this.document.getLength() - 1);\n        pos.column = this.document.getLine(pos.row).length;\n      } else if (row < 0) {\n        pos.row = 0;\n        pos.column = 0;\n      } else {\n        pos.row = row;\n        pos.column = Math.min(\n          this.document.getLine(pos.row).length,\n          Math.max(0, column),\n        );\n      }\n      if (column < 0) pos.column = 0;\n      return pos;\n    };\n    return Anchor;\n  })();\n  Anchor.prototype.$insertRight = false;\n  oop.implement(Anchor.prototype, EventEmitter);\n  function $pointsInOrder(point1, point2, equalPointsInOrder) {\n    var bColIsAfter = equalPointsInOrder\n      ? point1.column <= point2.column\n      : point1.column < point2.column;\n    return point1.row < point2.row || (point1.row == point2.row && bColIsAfter);\n  }\n  function $getTransformedPoint(delta, point, moveIfEqual) {\n    var deltaIsInsert = delta.action == \"insert\";\n    var deltaRowShift =\n      (deltaIsInsert ? 1 : -1) * (delta.end.row - delta.start.row);\n    var deltaColShift =\n      (deltaIsInsert ? 1 : -1) * (delta.end.column - delta.start.column);\n    var deltaStart = delta.start;\n    var deltaEnd = deltaIsInsert ? deltaStart : delta.end; // Collapse insert range.\n    if ($pointsInOrder(point, deltaStart, moveIfEqual)) {\n      return {\n        row: point.row,\n        column: point.column,\n      };\n    }\n    if ($pointsInOrder(deltaEnd, point, !moveIfEqual)) {\n      return {\n        row: point.row + deltaRowShift,\n        column: point.column + (point.row == deltaEnd.row ? deltaColShift : 0),\n      };\n    }\n    return {\n      row: deltaStart.row,\n      column: deltaStart.column,\n    };\n  }\n  exports.Anchor = Anchor;\n});\n\ndefine(\"ace/document\", [\n  \"require\",\n  \"exports\",\n  \"module\",\n  \"ace/lib/oop\",\n  \"ace/apply_delta\",\n  \"ace/lib/event_emitter\",\n  \"ace/range\",\n  \"ace/anchor\",\n], function (require, exports, module) {\n  \"use strict\";\n  var oop = require(\"./lib/oop\");\n  var applyDelta = require(\"./apply_delta\").applyDelta;\n  var EventEmitter = require(\"./lib/event_emitter\").EventEmitter;\n  var Range = require(\"./range\").Range;\n  var Anchor = require(\"./anchor\").Anchor;\n  var Document = /** @class */ (function () {\n    function Document(textOrLines) {\n      this.$lines = [\"\"];\n      if (textOrLines.length === 0) {\n        this.$lines = [\"\"];\n      } else if (Array.isArray(textOrLines)) {\n        this.insertMergedLines({ row: 0, column: 0 }, textOrLines);\n      } else {\n        this.insert({ row: 0, column: 0 }, textOrLines);\n      }\n    }\n    Document.prototype.setValue = function (text) {\n      var len = this.getLength() - 1;\n      this.remove(new Range(0, 0, len, this.getLine(len).length));\n      this.insert({ row: 0, column: 0 }, text || \"\");\n    };\n    Document.prototype.getValue = function () {\n      return this.getAllLines().join(this.getNewLineCharacter());\n    };\n    Document.prototype.createAnchor = function (row, column) {\n      return new Anchor(this, row, column);\n    };\n    Document.prototype.$detectNewLine = function (text) {\n      var match = text.match(/^.*?(\\r\\n|\\r|\\n)/m);\n      this.$autoNewLine = match ? match[1] : \"\\n\";\n      this._signal(\"changeNewLineMode\");\n    };\n    Document.prototype.getNewLineCharacter = function () {\n      switch (this.$newLineMode) {\n        case \"windows\":\n          return \"\\r\\n\";\n        case \"unix\":\n          return \"\\n\";\n        default:\n          return this.$autoNewLine || \"\\n\";\n      }\n    };\n    Document.prototype.setNewLineMode = function (newLineMode) {\n      if (this.$newLineMode === newLineMode) return;\n      this.$newLineMode = newLineMode;\n      this._signal(\"changeNewLineMode\");\n    };\n    Document.prototype.getNewLineMode = function () {\n      return this.$newLineMode;\n    };\n    Document.prototype.isNewLine = function (text) {\n      return text == \"\\r\\n\" || text == \"\\r\" || text == \"\\n\";\n    };\n    Document.prototype.getLine = function (row) {\n      return this.$lines[row] || \"\";\n    };\n    Document.prototype.getLines = function (firstRow, lastRow) {\n      return this.$lines.slice(firstRow, lastRow + 1);\n    };\n    Document.prototype.getAllLines = function () {\n      return this.getLines(0, this.getLength());\n    };\n    Document.prototype.getLength = function () {\n      return this.$lines.length;\n    };\n    Document.prototype.getTextRange = function (range) {\n      return this.getLinesForRange(range).join(this.getNewLineCharacter());\n    };\n    Document.prototype.getLinesForRange = function (range) {\n      var lines;\n      if (range.start.row === range.end.row) {\n        lines = [\n          this.getLine(range.start.row).substring(\n            range.start.column,\n            range.end.column,\n          ),\n        ];\n      } else {\n        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      }\n      return lines;\n    };\n    Document.prototype.insertLines = function (row, lines) {\n      console.warn(\n        \"Use of document.insertLines is deprecated. Use the insertFullLines method instead.\",\n      );\n      return this.insertFullLines(row, lines);\n    };\n    Document.prototype.removeLines = function (firstRow, lastRow) {\n      console.warn(\n        \"Use of document.removeLines is deprecated. Use the removeFullLines method instead.\",\n      );\n      return this.removeFullLines(firstRow, lastRow);\n    };\n    Document.prototype.insertNewLine = function (position) {\n      console.warn(\n        \"Use of document.insertNewLine is deprecated. Use insertMergedLines(position, ['', '']) instead.\",\n      );\n      return this.insertMergedLines(position, [\"\", \"\"]);\n    };\n    Document.prototype.insert = function (position, text) {\n      if (this.getLength() <= 1) this.$detectNewLine(text);\n      return this.insertMergedLines(position, this.$split(text));\n    };\n    Document.prototype.insertInLine = function (position, text) {\n      var start = this.clippedPos(position.row, position.column);\n      var end = this.pos(position.row, position.column + text.length);\n      this.applyDelta(\n        {\n          start: start,\n          end: end,\n          action: \"insert\",\n          lines: [text],\n        },\n        true,\n      );\n      return this.clonePos(end);\n    };\n    Document.prototype.clippedPos = function (row, column) {\n      var length = this.getLength();\n      if (row === undefined) {\n        row = length;\n      } else if (row < 0) {\n        row = 0;\n      } else if (row >= length) {\n        row = length - 1;\n        column = undefined;\n      }\n      var line = this.getLine(row);\n      if (column == undefined) column = line.length;\n      column = Math.min(Math.max(column, 0), line.length);\n      return { row: row, column: column };\n    };\n    Document.prototype.clonePos = function (pos) {\n      return { row: pos.row, column: pos.column };\n    };\n    Document.prototype.pos = function (row, column) {\n      return { row: row, column: column };\n    };\n    Document.prototype.$clipPosition = function (position) {\n      var length = this.getLength();\n      if (position.row >= length) {\n        position.row = Math.max(0, length - 1);\n        position.column = this.getLine(length - 1).length;\n      } else {\n        position.row = Math.max(0, position.row);\n        position.column = Math.min(\n          Math.max(position.column, 0),\n          this.getLine(position.row).length,\n        );\n      }\n      return position;\n    };\n    Document.prototype.insertFullLines = function (row, lines) {\n      row = Math.min(Math.max(row, 0), this.getLength());\n      var column = 0;\n      if (row < this.getLength()) {\n        lines = lines.concat([\"\"]);\n        column = 0;\n      } else {\n        lines = [\"\"].concat(lines);\n        row--;\n        column = this.$lines[row].length;\n      }\n      this.insertMergedLines({ row: row, column: column }, lines);\n    };\n    Document.prototype.insertMergedLines = function (position, lines) {\n      var start = this.clippedPos(position.row, position.column);\n      var end = {\n        row: start.row + lines.length - 1,\n        column:\n          (lines.length == 1 ? start.column : 0) +\n          lines[lines.length - 1].length,\n      };\n      this.applyDelta({\n        start: start,\n        end: end,\n        action: \"insert\",\n        lines: lines,\n      });\n      return this.clonePos(end);\n    };\n    Document.prototype.remove = function (range) {\n      var start = this.clippedPos(range.start.row, range.start.column);\n      var end = this.clippedPos(range.end.row, range.end.column);\n      this.applyDelta({\n        start: start,\n        end: end,\n        action: \"remove\",\n        lines: this.getLinesForRange({ start: start, end: end }),\n      });\n      return this.clonePos(start);\n    };\n    Document.prototype.removeInLine = function (row, startColumn, endColumn) {\n      var start = this.clippedPos(row, startColumn);\n      var end = this.clippedPos(row, endColumn);\n      this.applyDelta(\n        {\n          start: start,\n          end: end,\n          action: \"remove\",\n          lines: this.getLinesForRange({ start: start, end: end }),\n        },\n        true,\n      );\n      return this.clonePos(start);\n    };\n    Document.prototype.removeFullLines = function (firstRow, lastRow) {\n      firstRow = Math.min(Math.max(0, firstRow), this.getLength() - 1);\n      lastRow = Math.min(Math.max(0, lastRow), this.getLength() - 1);\n      var deleteFirstNewLine = lastRow == this.getLength() - 1 && firstRow > 0;\n      var deleteLastNewLine = lastRow < this.getLength() - 1;\n      var startRow = deleteFirstNewLine ? firstRow - 1 : firstRow;\n      var startCol = deleteFirstNewLine ? this.getLine(startRow).length : 0;\n      var endRow = deleteLastNewLine ? lastRow + 1 : lastRow;\n      var endCol = deleteLastNewLine ? 0 : this.getLine(endRow).length;\n      var range = new Range(startRow, startCol, endRow, endCol);\n      var deletedLines = this.$lines.slice(firstRow, lastRow + 1);\n      this.applyDelta({\n        start: range.start,\n        end: range.end,\n        action: \"remove\",\n        lines: this.getLinesForRange(range),\n      });\n      return deletedLines;\n    };\n    Document.prototype.removeNewLine = function (row) {\n      if (row < this.getLength() - 1 && row >= 0) {\n        this.applyDelta({\n          start: this.pos(row, this.getLine(row).length),\n          end: this.pos(row + 1, 0),\n          action: \"remove\",\n          lines: [\"\", \"\"],\n        });\n      }\n    };\n    Document.prototype.replace = function (range, text) {\n      if (!(range instanceof Range))\n        range = Range.fromPoints(range.start, range.end);\n      if (text.length === 0 && range.isEmpty()) return range.start;\n      if (text == this.getTextRange(range)) return range.end;\n      this.remove(range);\n      var end;\n      if (text) {\n        end = this.insert(range.start, text);\n      } else {\n        end = range.start;\n      }\n      return end;\n    };\n    Document.prototype.applyDeltas = function (deltas) {\n      for (var i = 0; i < deltas.length; i++) {\n        this.applyDelta(deltas[i]);\n      }\n    };\n    Document.prototype.revertDeltas = function (deltas) {\n      for (var i = deltas.length - 1; i >= 0; i--) {\n        this.revertDelta(deltas[i]);\n      }\n    };\n    Document.prototype.applyDelta = function (delta, doNotValidate) {\n      var isInsert = delta.action == \"insert\";\n      if (\n        isInsert\n          ? delta.lines.length <= 1 && !delta.lines[0]\n          : !Range.comparePoints(delta.start, delta.end)\n      ) {\n        return;\n      }\n      if (isInsert && delta.lines.length > 20000) {\n        this.$splitAndapplyLargeDelta(delta, 20000);\n      } else {\n        applyDelta(this.$lines, delta, doNotValidate);\n        this._signal(\"change\", delta);\n      }\n    };\n    Document.prototype.$safeApplyDelta = function (delta) {\n      var docLength = this.$lines.length;\n      if (\n        (delta.action == \"remove\" &&\n          delta.start.row < docLength &&\n          delta.end.row < docLength) ||\n        (delta.action == \"insert\" && delta.start.row <= docLength)\n      ) {\n        this.applyDelta(delta);\n      }\n    };\n    Document.prototype.$splitAndapplyLargeDelta = function (delta, MAX) {\n      var lines = delta.lines;\n      var l = lines.length - MAX + 1;\n      var row = delta.start.row;\n      var column = delta.start.column;\n      for (var from = 0, to = 0; from < l; from = to) {\n        to += MAX - 1;\n        var chunk = lines.slice(from, to);\n        chunk.push(\"\");\n        this.applyDelta(\n          {\n            start: this.pos(row + from, column),\n            end: this.pos(row + to, (column = 0)),\n            action: delta.action,\n            lines: chunk,\n          },\n          true,\n        );\n      }\n      delta.lines = lines.slice(from);\n      delta.start.row = row + from;\n      delta.start.column = column;\n      this.applyDelta(delta, true);\n    };\n    Document.prototype.revertDelta = function (delta) {\n      this.$safeApplyDelta({\n        start: this.clonePos(delta.start),\n        end: this.clonePos(delta.end),\n        action: delta.action == \"insert\" ? \"remove\" : \"insert\",\n        lines: delta.lines.slice(),\n      });\n    };\n    Document.prototype.indexToPosition = function (index, startRow) {\n      var lines = this.$lines || this.getAllLines();\n      var newlineLength = this.getNewLineCharacter().length;\n      for (var i = startRow || 0, l = lines.length; i < l; i++) {\n        index -= lines[i].length + newlineLength;\n        if (index < 0)\n          return { row: i, column: index + lines[i].length + newlineLength };\n      }\n      return {\n        row: l - 1,\n        column: index + lines[l - 1].length + newlineLength,\n      };\n    };\n    Document.prototype.positionToIndex = function (pos, startRow) {\n      var lines = this.$lines || this.getAllLines();\n      var newlineLength = this.getNewLineCharacter().length;\n      var index = 0;\n      var row = Math.min(pos.row, lines.length);\n      for (var i = startRow || 0; i < row; ++i)\n        index += lines[i].length + newlineLength;\n      return index + pos.column;\n    };\n    Document.prototype.$split = function (text) {\n      return text.split(/\\r\\n|\\r|\\n/);\n    };\n    return Document;\n  })();\n  Document.prototype.$autoNewLine = \"\";\n  Document.prototype.$newLineMode = \"auto\";\n  oop.implement(Document.prototype, EventEmitter);\n  exports.Document = Document;\n});\n\ndefine(\"ace/background_tokenizer\", [\n  \"require\",\n  \"exports\",\n  \"module\",\n  \"ace/lib/oop\",\n  \"ace/lib/event_emitter\",\n], function (require, exports, module) {\n  \"use strict\";\n  var oop = require(\"./lib/oop\");\n  var EventEmitter = require(\"./lib/event_emitter\").EventEmitter;\n  var BackgroundTokenizer = /** @class */ (function () {\n    function BackgroundTokenizer(tokenizer, session) {\n      this.running = false;\n      this.lines = [];\n      this.states = [];\n      this.currentLine = 0;\n      this.tokenizer = tokenizer;\n      var self = this;\n      this.$worker = function () {\n        if (!self.running) {\n          return;\n        }\n        var workerStart = new Date();\n        var currentLine = self.currentLine;\n        var endLine = -1;\n        var doc = self.doc;\n        var startLine = currentLine;\n        while (self.lines[currentLine]) currentLine++;\n        var len = doc.getLength();\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.running = setTimeout(self.$worker, 20);\n            break;\n          }\n        }\n        self.currentLine = currentLine;\n        if (endLine == -1) endLine = currentLine;\n        if (startLine <= endLine) self.fireUpdateEvent(startLine, endLine);\n      };\n    }\n    BackgroundTokenizer.prototype.setTokenizer = function (tokenizer) {\n      this.tokenizer = tokenizer;\n      this.lines = [];\n      this.states = [];\n      this.start(0);\n    };\n    BackgroundTokenizer.prototype.setDocument = function (doc) {\n      this.doc = doc;\n      this.lines = [];\n      this.states = [];\n      this.stop();\n    };\n    BackgroundTokenizer.prototype.fireUpdateEvent = function (\n      firstRow,\n      lastRow,\n    ) {\n      var data = {\n        first: firstRow,\n        last: lastRow,\n      };\n      this._signal(\"update\", { data: data });\n    };\n    BackgroundTokenizer.prototype.start = function (startRow) {\n      this.currentLine = Math.min(\n        startRow || 0,\n        this.currentLine,\n        this.doc.getLength(),\n      );\n      this.lines.splice(this.currentLine, this.lines.length);\n      this.states.splice(this.currentLine, this.states.length);\n      this.stop();\n      this.running = setTimeout(this.$worker, 700);\n    };\n    BackgroundTokenizer.prototype.scheduleStart = function () {\n      if (!this.running) this.running = setTimeout(this.$worker, 700);\n    };\n    BackgroundTokenizer.prototype.$updateOnChange = function (delta) {\n      var startRow = delta.start.row;\n      var len = delta.end.row - startRow;\n      if (len === 0) {\n        this.lines[startRow] = null;\n      } else if (delta.action == \"remove\") {\n        this.lines.splice(startRow, len + 1, null);\n        this.states.splice(startRow, len + 1, null);\n      } else {\n        var args = Array(len + 1);\n        args.unshift(startRow, 1);\n        this.lines.splice.apply(this.lines, args);\n        this.states.splice.apply(this.states, args);\n      }\n      this.currentLine = Math.min(\n        startRow,\n        this.currentLine,\n        this.doc.getLength(),\n      );\n      this.stop();\n    };\n    BackgroundTokenizer.prototype.stop = function () {\n      if (this.running) clearTimeout(this.running);\n      this.running = false;\n    };\n    BackgroundTokenizer.prototype.getTokens = function (row) {\n      return this.lines[row] || this.$tokenizeRow(row);\n    };\n    BackgroundTokenizer.prototype.getState = function (row) {\n      if (this.currentLine == row) this.$tokenizeRow(row);\n      return this.states[row] || \"start\";\n    };\n    BackgroundTokenizer.prototype.$tokenizeRow = function (row) {\n      var line = this.doc.getLine(row);\n      var state = this.states[row - 1];\n      var data = this.tokenizer.getLineTokens(line, state, row);\n      if (this.states[row] + \"\" !== data.state + \"\") {\n        this.states[row] = data.state;\n        this.lines[row + 1] = null;\n        if (this.currentLine > row + 1) this.currentLine = row + 1;\n      } else if (this.currentLine == row) {\n        this.currentLine = row + 1;\n      }\n      return (this.lines[row] = data.tokens);\n    };\n    BackgroundTokenizer.prototype.cleanup = function () {\n      this.running = false;\n      this.lines = [];\n      this.states = [];\n      this.currentLine = 0;\n      this.removeAllListeners();\n    };\n    return BackgroundTokenizer;\n  })();\n  oop.implement(BackgroundTokenizer.prototype, EventEmitter);\n  exports.BackgroundTokenizer = BackgroundTokenizer;\n});\n\ndefine(\"ace/search_highlight\", [\n  \"require\",\n  \"exports\",\n  \"module\",\n  \"ace/lib/lang\",\n  \"ace/range\",\n], function (require, exports, module) {\n  \"use strict\";\n  var lang = require(\"./lib/lang\");\n  var Range = require(\"./range\").Range;\n  var SearchHighlight = /** @class */ (function () {\n    function SearchHighlight(regExp, clazz, type) {\n      if (type === void 0) {\n        type = \"text\";\n      }\n      this.setRegexp(regExp);\n      this.clazz = clazz;\n      this.type = type;\n    }\n    SearchHighlight.prototype.setRegexp = function (regExp) {\n      if (this.regExp + \"\" == regExp + \"\") return;\n      this.regExp = regExp;\n      this.cache = [];\n    };\n    SearchHighlight.prototype.update = function (\n      html,\n      markerLayer,\n      session,\n      config,\n    ) {\n      if (!this.regExp) return;\n      var start = config.firstRow,\n        end = config.lastRow;\n      var renderedMarkerRanges = {};\n      for (var i = start; i <= end; i++) {\n        var ranges = this.cache[i];\n        if (ranges == null) {\n          ranges = lang.getMatchOffsets(session.getLine(i), this.regExp);\n          if (ranges.length > this.MAX_RANGES)\n            ranges = ranges.slice(0, this.MAX_RANGES);\n          ranges = ranges.map(function (match) {\n            return new Range(i, match.offset, i, match.offset + match.length);\n          });\n          this.cache[i] = ranges.length ? ranges : \"\";\n        }\n        for (var j = ranges.length; j--; ) {\n          var rangeToAddMarkerTo = ranges[j].toScreenRange(session);\n          var rangeAsString = rangeToAddMarkerTo.toString();\n          if (renderedMarkerRanges[rangeAsString]) continue;\n          renderedMarkerRanges[rangeAsString] = true;\n          markerLayer.drawSingleLineMarker(\n            html,\n            rangeToAddMarkerTo,\n            this.clazz,\n            config,\n          );\n        }\n      }\n    };\n    return SearchHighlight;\n  })();\n  SearchHighlight.prototype.MAX_RANGES = 500;\n  exports.SearchHighlight = SearchHighlight;\n});\n\ndefine(\"ace/undomanager\", [\n  \"require\",\n  \"exports\",\n  \"module\",\n  \"ace/range\",\n], function (require, exports, module) {\n  \"use strict\";\n  var UndoManager = /** @class */ (function () {\n    function UndoManager() {\n      this.$keepRedoStack;\n      this.$maxRev = 0;\n      this.$fromUndo = false;\n      this.$undoDepth = Infinity;\n      this.reset();\n    }\n    UndoManager.prototype.addSession = function (session) {\n      this.$session = session;\n    };\n    UndoManager.prototype.add = function (delta, allowMerge, session) {\n      if (this.$fromUndo) return;\n      if (delta == this.$lastDelta) return;\n      if (!this.$keepRedoStack) this.$redoStack.length = 0;\n      if (allowMerge === false || !this.lastDeltas) {\n        this.lastDeltas = [];\n        var undoStackLength = this.$undoStack.length;\n        if (undoStackLength > this.$undoDepth - 1) {\n          this.$undoStack.splice(0, undoStackLength - this.$undoDepth + 1);\n        }\n        this.$undoStack.push(this.lastDeltas);\n        delta.id = this.$rev = ++this.$maxRev;\n      }\n      if (delta.action == \"remove\" || delta.action == \"insert\")\n        this.$lastDelta = delta;\n      this.lastDeltas.push(delta);\n    };\n    UndoManager.prototype.addSelection = function (selection, rev) {\n      this.selections.push({\n        value: selection,\n        rev: rev || this.$rev,\n      });\n    };\n    UndoManager.prototype.startNewGroup = function () {\n      this.lastDeltas = null;\n      return this.$rev;\n    };\n    UndoManager.prototype.markIgnored = function (from, to) {\n      if (to == null) to = this.$rev + 1;\n      var stack = this.$undoStack;\n      for (var i = stack.length; i--; ) {\n        var delta = stack[i][0];\n        if (delta.id <= from) break;\n        if (delta.id < to) delta.ignore = true;\n      }\n      this.lastDeltas = null;\n    };\n    UndoManager.prototype.getSelection = function (rev, after) {\n      var stack = this.selections;\n      for (var i = stack.length; i--; ) {\n        var selection = stack[i];\n        if (selection.rev < rev) {\n          if (after) selection = stack[i + 1];\n          return selection;\n        }\n      }\n    };\n    UndoManager.prototype.getRevision = function () {\n      return this.$rev;\n    };\n    UndoManager.prototype.getDeltas = function (from, to) {\n      if (to == null) to = this.$rev + 1;\n      var stack = this.$undoStack;\n      var end = null,\n        start = 0;\n      for (var i = stack.length; i--; ) {\n        var delta = stack[i][0];\n        if (delta.id < to && !end) end = i + 1;\n        if (delta.id <= from) {\n          start = i + 1;\n          break;\n        }\n      }\n      return stack.slice(start, end);\n    };\n    UndoManager.prototype.getChangedRanges = function (from, to) {\n      if (to == null) to = this.$rev + 1;\n    };\n    UndoManager.prototype.getChangedLines = function (from, to) {\n      if (to == null) to = this.$rev + 1;\n    };\n    UndoManager.prototype.undo = function (session, dontSelect) {\n      this.lastDeltas = null;\n      var stack = this.$undoStack;\n      if (!rearrangeUndoStack(stack, stack.length)) return;\n      if (!session) session = this.$session;\n      if (this.$redoStackBaseRev !== this.$rev && this.$redoStack.length)\n        this.$redoStack = [];\n      this.$fromUndo = true;\n      var deltaSet = stack.pop();\n      var undoSelectionRange = null;\n      if (deltaSet) {\n        undoSelectionRange = session.undoChanges(deltaSet, dontSelect);\n        this.$redoStack.push(deltaSet);\n        this.$syncRev();\n      }\n      this.$fromUndo = false;\n      return undoSelectionRange;\n    };\n    UndoManager.prototype.redo = function (session, dontSelect) {\n      this.lastDeltas = null;\n      if (!session) session = this.$session;\n      this.$fromUndo = true;\n      if (this.$redoStackBaseRev != this.$rev) {\n        var diff = this.getDeltas(this.$redoStackBaseRev, this.$rev + 1);\n        rebaseRedoStack(this.$redoStack, diff);\n        this.$redoStackBaseRev = this.$rev;\n        this.$redoStack.forEach(function (x) {\n          x[0].id = ++this.$maxRev;\n        }, this);\n      }\n      var deltaSet = this.$redoStack.pop();\n      var redoSelectionRange = null;\n      if (deltaSet) {\n        redoSelectionRange = session.redoChanges(deltaSet, dontSelect);\n        this.$undoStack.push(deltaSet);\n        this.$syncRev();\n      }\n      this.$fromUndo = false;\n      return redoSelectionRange;\n    };\n    UndoManager.prototype.$syncRev = function () {\n      var stack = this.$undoStack;\n      var nextDelta = stack[stack.length - 1];\n      var id = (nextDelta && nextDelta[0].id) || 0;\n      this.$redoStackBaseRev = id;\n      this.$rev = id;\n    };\n    UndoManager.prototype.reset = function () {\n      this.lastDeltas = null;\n      this.$lastDelta = null;\n      this.$undoStack = [];\n      this.$redoStack = [];\n      this.$rev = 0;\n      this.mark = 0;\n      this.$redoStackBaseRev = this.$rev;\n      this.selections = [];\n    };\n    UndoManager.prototype.canUndo = function () {\n      return this.$undoStack.length > 0;\n    };\n    UndoManager.prototype.canRedo = function () {\n      return this.$redoStack.length > 0;\n    };\n    UndoManager.prototype.bookmark = function (rev) {\n      if (rev == undefined) rev = this.$rev;\n      this.mark = rev;\n    };\n    UndoManager.prototype.isAtBookmark = function () {\n      return this.$rev === this.mark;\n    };\n    UndoManager.prototype.toJSON = function () {\n      return {\n        $redoStack: this.$redoStack,\n        $undoStack: this.$undoStack,\n      };\n    };\n    UndoManager.prototype.fromJSON = function (json) {\n      this.reset();\n      this.$undoStack = json.$undoStack;\n      this.$redoStack = json.$redoStack;\n    };\n    UndoManager.prototype.$prettyPrint = function (delta) {\n      if (delta) return stringifyDelta(delta);\n      return (\n        stringifyDelta(this.$undoStack) +\n        \"\\n---\\n\" +\n        stringifyDelta(this.$redoStack)\n      );\n    };\n    return UndoManager;\n  })();\n  UndoManager.prototype.hasUndo = UndoManager.prototype.canUndo;\n  UndoManager.prototype.hasRedo = UndoManager.prototype.canRedo;\n  UndoManager.prototype.isClean = UndoManager.prototype.isAtBookmark;\n  UndoManager.prototype.markClean = UndoManager.prototype.bookmark;\n  function rearrangeUndoStack(stack, pos) {\n    for (var i = pos; i--; ) {\n      var deltaSet = stack[i];\n      if (deltaSet && !deltaSet[0].ignore) {\n        while (i < pos - 1) {\n          var swapped = swapGroups(stack[i], stack[i + 1]);\n          stack[i] = swapped[0];\n          stack[i + 1] = swapped[1];\n          i++;\n        }\n        return true;\n      }\n    }\n  }\n  var Range = require(\"./range\").Range;\n  var cmp = Range.comparePoints;\n  var comparePoints = Range.comparePoints;\n  function $updateMarkers(delta) {\n    var isInsert = delta.action == \"insert\";\n    var start = delta.start;\n    var end = delta.end;\n    var rowShift = (end.row - start.row) * (isInsert ? 1 : -1);\n    var colShift = (end.column - start.column) * (isInsert ? 1 : -1);\n    if (isInsert) end = start;\n    for (var i in this.marks) {\n      var point = this.marks[i];\n      var cmp = comparePoints(point, start);\n      if (cmp < 0) {\n        continue; // delta starts after the range\n      }\n      if (cmp === 0) {\n        if (isInsert) {\n          if (point.bias == 1) {\n            cmp = 1;\n          } else {\n            point.bias == -1;\n            continue;\n          }\n        }\n      }\n      var cmp2 = isInsert ? cmp : comparePoints(point, end);\n      if (cmp2 > 0) {\n        point.row += rowShift;\n        point.column += point.row == end.row ? colShift : 0;\n        continue;\n      }\n      if (!isInsert && cmp2 <= 0) {\n        point.row = start.row;\n        point.column = start.column;\n        if (cmp2 === 0) point.bias = 1;\n      }\n    }\n  }\n  function clonePos(pos) {\n    return { row: pos.row, column: pos.column };\n  }\n  function cloneDelta(d) {\n    return {\n      start: clonePos(d.start),\n      end: clonePos(d.end),\n      action: d.action,\n      lines: d.lines.slice(),\n    };\n  }\n  function stringifyDelta(d) {\n    d = d || this;\n    if (Array.isArray(d)) {\n      return d.map(stringifyDelta).join(\"\\n\");\n    }\n    var type = \"\";\n    if (d.action) {\n      type = d.action == \"insert\" ? \"+\" : \"-\";\n      type += \"[\" + d.lines + \"]\";\n    } else if (d.value) {\n      if (Array.isArray(d.value)) {\n        type = d.value.map(stringifyRange).join(\"\\n\");\n      } else {\n        type = stringifyRange(d.value);\n      }\n    }\n    if (d.start) {\n      type += stringifyRange(d);\n    }\n    if (d.id || d.rev) {\n      type += \"\\t(\" + (d.id || d.rev) + \")\";\n    }\n    return type;\n  }\n  function stringifyRange(r) {\n    return (\n      r.start.row + \":\" + r.start.column + \"=>\" + r.end.row + \":\" + r.end.column\n    );\n  }\n  function swap(d1, d2) {\n    var i1 = d1.action == \"insert\";\n    var i2 = d2.action == \"insert\";\n    if (i1 && i2) {\n      if (cmp(d2.start, d1.end) >= 0) {\n        shift(d2, d1, -1);\n      } else if (cmp(d2.start, d1.start) <= 0) {\n        shift(d1, d2, +1);\n      } else {\n        return null;\n      }\n    } else if (i1 && !i2) {\n      if (cmp(d2.start, d1.end) >= 0) {\n        shift(d2, d1, -1);\n      } else if (cmp(d2.end, d1.start) <= 0) {\n        shift(d1, d2, -1);\n      } else {\n        return null;\n      }\n    } else if (!i1 && i2) {\n      if (cmp(d2.start, d1.start) >= 0) {\n        shift(d2, d1, +1);\n      } else if (cmp(d2.start, d1.start) <= 0) {\n        shift(d1, d2, +1);\n      } else {\n        return null;\n      }\n    } else if (!i1 && !i2) {\n      if (cmp(d2.start, d1.start) >= 0) {\n        shift(d2, d1, +1);\n      } else if (cmp(d2.end, d1.start) <= 0) {\n        shift(d1, d2, -1);\n      } else {\n        return null;\n      }\n    }\n    return [d2, d1];\n  }\n  function swapGroups(ds1, ds2) {\n    for (var i = ds1.length; i--; ) {\n      for (var j = 0; j < ds2.length; j++) {\n        if (!swap(ds1[i], ds2[j])) {\n          while (i < ds1.length) {\n            while (j--) {\n              swap(ds2[j], ds1[i]);\n            }\n            j = ds2.length;\n            i++;\n          }\n          return [ds1, ds2];\n        }\n      }\n    }\n    ds1.selectionBefore =\n      ds2.selectionBefore =\n      ds1.selectionAfter =\n      ds2.selectionAfter =\n        null;\n    return [ds2, ds1];\n  }\n  function xform(d1, c1) {\n    var i1 = d1.action == \"insert\";\n    var i2 = c1.action == \"insert\";\n    if (i1 && i2) {\n      if (cmp(d1.start, c1.start) < 0) {\n        shift(c1, d1, 1);\n      } else {\n        shift(d1, c1, 1);\n      }\n    } else if (i1 && !i2) {\n      if (cmp(d1.start, c1.end) >= 0) {\n        shift(d1, c1, -1);\n      } else if (cmp(d1.start, c1.start) <= 0) {\n        shift(c1, d1, +1);\n      } else {\n        shift(d1, Range.fromPoints(c1.start, d1.start), -1);\n        shift(c1, d1, +1);\n      }\n    } else if (!i1 && i2) {\n      if (cmp(c1.start, d1.end) >= 0) {\n        shift(c1, d1, -1);\n      } else if (cmp(c1.start, d1.start) <= 0) {\n        shift(d1, c1, +1);\n      } else {\n        shift(c1, Range.fromPoints(d1.start, c1.start), -1);\n        shift(d1, c1, +1);\n      }\n    } else if (!i1 && !i2) {\n      if (cmp(c1.start, d1.end) >= 0) {\n        shift(c1, d1, -1);\n      } else if (cmp(c1.end, d1.start) <= 0) {\n        shift(d1, c1, -1);\n      } else {\n        var before, after;\n        if (cmp(d1.start, c1.start) < 0) {\n          before = d1;\n          d1 = splitDelta(d1, c1.start);\n        }\n        if (cmp(d1.end, c1.end) > 0) {\n          after = splitDelta(d1, c1.end);\n        }\n        shiftPos(c1.end, d1.start, d1.end, -1);\n        if (after && !before) {\n          d1.lines = after.lines;\n          d1.start = after.start;\n          d1.end = after.end;\n          after = d1;\n        }\n        return [c1, before, after].filter(Boolean);\n      }\n    }\n    return [c1, d1];\n  }\n  function shift(d1, d2, dir) {\n    shiftPos(d1.start, d2.start, d2.end, dir);\n    shiftPos(d1.end, d2.start, d2.end, dir);\n  }\n  function shiftPos(pos, start, end, dir) {\n    if (pos.row == (dir == 1 ? start : end).row) {\n      pos.column += dir * (end.column - start.column);\n    }\n    pos.row += dir * (end.row - start.row);\n  }\n  function splitDelta(c, pos) {\n    var lines = c.lines;\n    var end = c.end;\n    c.end = clonePos(pos);\n    var rowsBefore = c.end.row - c.start.row;\n    var otherLines = lines.splice(rowsBefore, lines.length);\n    var col = rowsBefore ? pos.column : pos.column - c.start.column;\n    lines.push(otherLines[0].substring(0, col));\n    otherLines[0] = otherLines[0].substr(col);\n    var rest = {\n      start: clonePos(pos),\n      end: end,\n      lines: otherLines,\n      action: c.action,\n    };\n    return rest;\n  }\n  function moveDeltasByOne(redoStack, d) {\n    d = cloneDelta(d);\n    for (var j = redoStack.length; j--; ) {\n      var deltaSet = redoStack[j];\n      for (var i = 0; i < deltaSet.length; i++) {\n        var x = deltaSet[i];\n        var xformed = xform(x, d);\n        d = xformed[0];\n        if (xformed.length != 2) {\n          if (xformed[2]) {\n            deltaSet.splice(i + 1, 1, xformed[1], xformed[2]);\n            i++;\n          } else if (!xformed[1]) {\n            deltaSet.splice(i, 1);\n            i--;\n          }\n        }\n      }\n      if (!deltaSet.length) {\n        redoStack.splice(j, 1);\n      }\n    }\n    return redoStack;\n  }\n  function rebaseRedoStack(redoStack, deltaSets) {\n    for (var i = 0; i < deltaSets.length; i++) {\n      var deltas = deltaSets[i];\n      for (var j = 0; j < deltas.length; j++) {\n        moveDeltasByOne(redoStack, deltas[j]);\n      }\n    }\n  }\n  exports.UndoManager = UndoManager;\n});\n\ndefine(\"ace/edit_session/fold_line\", [\n  \"require\",\n  \"exports\",\n  \"module\",\n  \"ace/range\",\n], function (require, exports, module) {\n  \"use strict\";\n  var Range = require(\"../range\").Range;\n  var FoldLine = /** @class */ (function () {\n    function FoldLine(foldData, folds) {\n      this.foldData = foldData;\n      if (Array.isArray(folds)) {\n        this.folds = folds;\n      } else {\n        folds = this.folds = [folds];\n      }\n      var last = folds[folds.length - 1];\n      this.range = new Range(\n        folds[0].start.row,\n        folds[0].start.column,\n        last.end.row,\n        last.end.column,\n      );\n      this.start = this.range.start;\n      this.end = this.range.end;\n      this.folds.forEach(function (fold) {\n        fold.setFoldLine(this);\n      }, this);\n    }\n    FoldLine.prototype.shiftRow = function (shift) {\n      this.start.row += shift;\n      this.end.row += shift;\n      this.folds.forEach(function (fold) {\n        fold.start.row += shift;\n        fold.end.row += shift;\n      });\n    };\n    FoldLine.prototype.addFold = function (fold) {\n      if (fold.sameRow) {\n        if (fold.start.row < this.startRow || fold.endRow > this.endRow) {\n          throw new Error(\n            \"Can't add a fold to this FoldLine as it has no connection\",\n          );\n        }\n        this.folds.push(fold);\n        this.folds.sort(function (a, b) {\n          return -a.range.compareEnd(b.start.row, b.start.column);\n        });\n        if (this.range.compareEnd(fold.start.row, fold.start.column) > 0) {\n          this.end.row = fold.end.row;\n          this.end.column = fold.end.column;\n        } else if (this.range.compareStart(fold.end.row, fold.end.column) < 0) {\n          this.start.row = fold.start.row;\n          this.start.column = fold.start.column;\n        }\n      } else if (fold.start.row == this.end.row) {\n        this.folds.push(fold);\n        this.end.row = fold.end.row;\n        this.end.column = fold.end.column;\n      } else if (fold.end.row == this.start.row) {\n        this.folds.unshift(fold);\n        this.start.row = fold.start.row;\n        this.start.column = fold.start.column;\n      } else {\n        throw new Error(\n          \"Trying to add fold to FoldRow that doesn't have a matching row\",\n        );\n      }\n      fold.foldLine = this;\n    };\n    FoldLine.prototype.containsRow = function (row) {\n      return row >= this.start.row && row <= this.end.row;\n    };\n    FoldLine.prototype.walk = function (callback, endRow, endColumn) {\n      var lastEnd = 0,\n        folds = this.folds,\n        fold,\n        cmp,\n        stop,\n        isNewRow = true;\n      if (endRow == null) {\n        endRow = this.end.row;\n        endColumn = this.end.column;\n      }\n      for (var i = 0; i < folds.length; i++) {\n        fold = folds[i];\n        cmp = fold.range.compareStart(endRow, endColumn);\n        if (cmp == -1) {\n          callback(null, endRow, endColumn, lastEnd, isNewRow);\n          return;\n        }\n        stop = callback(\n          null,\n          fold.start.row,\n          fold.start.column,\n          lastEnd,\n          isNewRow,\n        );\n        stop =\n          !stop &&\n          callback(\n            fold.placeholder,\n            fold.start.row,\n            fold.start.column,\n            lastEnd,\n          );\n        if (stop || cmp === 0) {\n          return;\n        }\n        isNewRow = !fold.sameRow;\n        lastEnd = fold.end.column;\n      }\n      callback(null, endRow, endColumn, lastEnd, isNewRow);\n    };\n    FoldLine.prototype.getNextFoldTo = function (row, column) {\n      var fold, cmp;\n      for (var i = 0; i < this.folds.length; i++) {\n        fold = this.folds[i];\n        cmp = fold.range.compareEnd(row, column);\n        if (cmp == -1) {\n          return {\n            fold: fold,\n            kind: \"after\",\n          };\n        } else if (cmp === 0) {\n          return {\n            fold: fold,\n            kind: \"inside\",\n          };\n        }\n      }\n      return null;\n    };\n    FoldLine.prototype.addRemoveChars = function (row, column, len) {\n      var ret = this.getNextFoldTo(row, column),\n        fold,\n        folds;\n      if (ret) {\n        fold = ret.fold;\n        if (\n          ret.kind == \"inside\" &&\n          fold.start.column != column &&\n          fold.start.row != row\n        ) {\n          window.console && window.console.log(row, column, fold);\n        } else if (fold.start.row == row) {\n          folds = this.folds;\n          var i = folds.indexOf(fold);\n          if (i === 0) {\n            this.start.column += len;\n          }\n          for (i; i < folds.length; i++) {\n            fold = folds[i];\n            fold.start.column += len;\n            if (!fold.sameRow) {\n              return;\n            }\n            fold.end.column += len;\n          }\n          this.end.column += len;\n        }\n      }\n    };\n    FoldLine.prototype.split = function (row, column) {\n      var pos = this.getNextFoldTo(row, column);\n      if (!pos || pos.kind == \"inside\") return null;\n      var fold = pos.fold;\n      var folds = this.folds;\n      var foldData = this.foldData;\n      var i = folds.indexOf(fold);\n      var foldBefore = folds[i - 1];\n      this.end.row = foldBefore.end.row;\n      this.end.column = foldBefore.end.column;\n      folds = folds.splice(i, folds.length - i);\n      var newFoldLine = new FoldLine(foldData, folds);\n      foldData.splice(foldData.indexOf(this) + 1, 0, newFoldLine);\n      return newFoldLine;\n    };\n    FoldLine.prototype.merge = function (foldLineNext) {\n      var folds = foldLineNext.folds;\n      for (var i = 0; i < folds.length; i++) {\n        this.addFold(folds[i]);\n      }\n      var foldData = this.foldData;\n      foldData.splice(foldData.indexOf(foldLineNext), 1);\n    };\n    FoldLine.prototype.toString = function () {\n      var ret = [this.range.toString() + \": [\"];\n      this.folds.forEach(function (fold) {\n        ret.push(\"  \" + fold.toString());\n      });\n      ret.push(\"]\");\n      return ret.join(\"\\n\");\n    };\n    FoldLine.prototype.idxToPosition = function (idx) {\n      var lastFoldEndColumn = 0;\n      for (var i = 0; i < this.folds.length; i++) {\n        var fold = this.folds[i];\n        idx -= fold.start.column - lastFoldEndColumn;\n        if (idx < 0) {\n          return {\n            row: fold.start.row,\n            column: fold.start.column + idx,\n          };\n        }\n        idx -= fold.placeholder.length;\n        if (idx < 0) {\n          return fold.start;\n        }\n        lastFoldEndColumn = fold.end.column;\n      }\n      return {\n        row: this.end.row,\n        column: this.end.column + idx,\n      };\n    };\n    return FoldLine;\n  })();\n  exports.FoldLine = FoldLine;\n});\n\ndefine(\"ace/range_list\", [\n  \"require\",\n  \"exports\",\n  \"module\",\n  \"ace/range\",\n], function (require, exports, module) {\n  \"use strict\";\n  var Range = require(\"./range\").Range;\n  var comparePoints = Range.comparePoints;\n  var RangeList = /** @class */ (function () {\n    function RangeList() {\n      this.ranges = [];\n      this.$bias = 1;\n    }\n    RangeList.prototype.pointIndex = function (pos, excludeEdges, startIndex) {\n      var list = this.ranges;\n      for (var i = startIndex || 0; i < list.length; i++) {\n        var range = list[i];\n        var cmpEnd = comparePoints(pos, range.end);\n        if (cmpEnd > 0) continue;\n        var cmpStart = comparePoints(pos, range.start);\n        if (cmpEnd === 0) return excludeEdges && cmpStart !== 0 ? -i - 2 : i;\n        if (cmpStart > 0 || (cmpStart === 0 && !excludeEdges)) return i;\n        return -i - 1;\n      }\n      return -i - 1;\n    };\n    RangeList.prototype.add = function (range) {\n      var excludeEdges = !range.isEmpty();\n      var startIndex = this.pointIndex(range.start, excludeEdges);\n      if (startIndex < 0) startIndex = -startIndex - 1;\n      var endIndex = this.pointIndex(range.end, excludeEdges, startIndex);\n      if (endIndex < 0) endIndex = -endIndex - 1;\n      else endIndex++;\n      return this.ranges.splice(startIndex, endIndex - startIndex, range);\n    };\n    RangeList.prototype.addList = function (list) {\n      var removed = [];\n      for (var i = list.length; i--; ) {\n        removed.push.apply(removed, this.add(list[i]));\n      }\n      return removed;\n    };\n    RangeList.prototype.substractPoint = function (pos) {\n      var i = this.pointIndex(pos);\n      if (i >= 0) return this.ranges.splice(i, 1);\n    };\n    RangeList.prototype.merge = function () {\n      var removed = [];\n      var list = this.ranges;\n      list = list.sort(function (a, b) {\n        return comparePoints(a.start, b.start);\n      });\n      var next = list[0],\n        range;\n      for (var i = 1; i < list.length; i++) {\n        range = next;\n        next = list[i];\n        var cmp = comparePoints(range.end, next.start);\n        if (cmp < 0) continue;\n        if (cmp == 0 && !range.isEmpty() && !next.isEmpty()) continue;\n        if (comparePoints(range.end, next.end) < 0) {\n          range.end.row = next.end.row;\n          range.end.column = next.end.column;\n        }\n        list.splice(i, 1);\n        removed.push(next);\n        next = range;\n        i--;\n      }\n      this.ranges = list;\n      return removed;\n    };\n    RangeList.prototype.contains = function (row, column) {\n      return this.pointIndex({ row: row, column: column }) >= 0;\n    };\n    RangeList.prototype.containsPoint = function (pos) {\n      return this.pointIndex(pos) >= 0;\n    };\n    RangeList.prototype.rangeAtPoint = function (pos) {\n      var i = this.pointIndex(pos);\n      if (i >= 0) return this.ranges[i];\n    };\n    RangeList.prototype.clipRows = function (startRow, endRow) {\n      var list = this.ranges;\n      if (\n        list[0].start.row > endRow ||\n        list[list.length - 1].start.row < startRow\n      )\n        return [];\n      var startIndex = this.pointIndex({ row: startRow, column: 0 });\n      if (startIndex < 0) startIndex = -startIndex - 1;\n      var endIndex = this.pointIndex({ row: endRow, column: 0 }, startIndex);\n      if (endIndex < 0) endIndex = -endIndex - 1;\n      var clipped = [];\n      for (var i = startIndex; i < endIndex; i++) {\n        clipped.push(list[i]);\n      }\n      return clipped;\n    };\n    RangeList.prototype.removeAll = function () {\n      return this.ranges.splice(0, this.ranges.length);\n    };\n    RangeList.prototype.attach = function (session) {\n      if (this.session) this.detach();\n      this.session = session;\n      this.onChange = this.$onChange.bind(this);\n      this.session.on(\"change\", this.onChange);\n    };\n    RangeList.prototype.detach = function () {\n      if (!this.session) return;\n      this.session.removeListener(\"change\", this.onChange);\n      this.session = null;\n    };\n    RangeList.prototype.$onChange = function (delta) {\n      var start = delta.start;\n      var end = delta.end;\n      var startRow = start.row;\n      var endRow = end.row;\n      var ranges = this.ranges;\n      for (var i = 0, n = ranges.length; i < n; i++) {\n        var r = ranges[i];\n        if (r.end.row >= startRow) break;\n      }\n      if (delta.action == \"insert\") {\n        var lineDif = endRow - startRow;\n        var colDiff = -start.column + end.column;\n        for (; i < n; i++) {\n          var r = ranges[i];\n          if (r.start.row > startRow) break;\n          if (r.start.row == startRow && r.start.column >= start.column) {\n            if (r.start.column == start.column && this.$bias <= 0) {\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.$bias < 0) {\n              continue;\n            }\n            if (r.end.column == start.column && colDiff > 0 && i < n - 1) {\n              if (\n                r.end.column > r.start.column &&\n                r.end.column == ranges[i + 1].start.column\n              )\n                r.end.column -= colDiff;\n            }\n            r.end.column += colDiff;\n            r.end.row += lineDif;\n          }\n        }\n      } else {\n        var lineDif = startRow - endRow;\n        var colDiff = start.column - end.column;\n        for (; i < n; i++) {\n          var r = ranges[i];\n          if (r.start.row > endRow) break;\n          if (\n            r.end.row < endRow &&\n            (startRow < r.end.row ||\n              (startRow == r.end.row && start.column < r.end.column))\n          ) {\n            r.end.row = startRow;\n            r.end.column = start.column;\n          } else if (r.end.row == endRow) {\n            if (r.end.column <= end.column) {\n              if (lineDif || r.end.column > start.column) {\n                r.end.column = start.column;\n                r.end.row = start.row;\n              }\n            } else {\n              r.end.column += colDiff;\n              r.end.row += lineDif;\n            }\n          } else if (r.end.row > endRow) {\n            r.end.row += lineDif;\n          }\n          if (\n            r.start.row < endRow &&\n            (startRow < r.start.row ||\n              (startRow == r.start.row && start.column < r.start.column))\n          ) {\n            r.start.row = startRow;\n            r.start.column = start.column;\n          } else if (r.start.row == endRow) {\n            if (r.start.column <= end.column) {\n              if (lineDif || r.start.column > start.column) {\n                r.start.column = start.column;\n                r.start.row = start.row;\n              }\n            } else {\n              r.start.column += colDiff;\n              r.start.row += lineDif;\n            }\n          } else if (r.start.row > endRow) {\n            r.start.row += lineDif;\n          }\n        }\n      }\n      if (lineDif != 0 && i < n) {\n        for (; i < n; i++) {\n          var r = ranges[i];\n          r.start.row += lineDif;\n          r.end.row += lineDif;\n        }\n      }\n    };\n    return RangeList;\n  })();\n  RangeList.prototype.comparePoints = comparePoints;\n  exports.RangeList = RangeList;\n});\n\ndefine(\"ace/edit_session/fold\", [\n  \"require\",\n  \"exports\",\n  \"module\",\n  \"ace/range_list\",\n], function (require, exports, module) {\n  \"use strict\";\n  var __extends =\n    (this && this.__extends) ||\n    (function () {\n      var extendStatics = function (d, b) {\n        extendStatics =\n          Object.setPrototypeOf ||\n          ({ __proto__: [] } instanceof Array &&\n            function (d, b) {\n              d.__proto__ = b;\n            }) ||\n          function (d, b) {\n            for (var p in b)\n              if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p];\n          };\n        return extendStatics(d, b);\n      };\n      return function (d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\n            \"Class extends value \" +\n              String(b) +\n              \" is not a constructor or null\",\n          );\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype =\n          b === null\n            ? Object.create(b)\n            : ((__.prototype = b.prototype), new __());\n      };\n    })();\n  var RangeList = require(\"../range_list\").RangeList;\n  var Fold = /** @class */ (function (_super) {\n    __extends(Fold, _super);\n    function Fold(range, placeholder) {\n      var _this = _super.call(this) || this;\n      _this.foldLine = null;\n      _this.placeholder = placeholder;\n      _this.range = range;\n      _this.start = range.start;\n      _this.end = range.end;\n      _this.sameRow = range.start.row == range.end.row;\n      _this.subFolds = _this.ranges = [];\n      return _this;\n    }\n    Fold.prototype.toString = function () {\n      return '\"' + this.placeholder + '\" ' + this.range.toString();\n    };\n    Fold.prototype.setFoldLine = function (foldLine) {\n      this.foldLine = foldLine;\n      this.subFolds.forEach(function (fold) {\n        fold.setFoldLine(foldLine);\n      });\n    };\n    Fold.prototype.clone = function () {\n      var range = this.range.clone();\n      var fold = new Fold(range, this.placeholder);\n      this.subFolds.forEach(function (subFold) {\n        fold.subFolds.push(subFold.clone());\n      });\n      fold.collapseChildren = this.collapseChildren;\n      return fold;\n    };\n    Fold.prototype.addSubFold = function (fold) {\n      if (this.range.isEqual(fold)) return;\n      consumeRange(fold, this.start);\n      var row = fold.start.row,\n        column = fold.start.column;\n      for (var i = 0, cmp = -1; i < this.subFolds.length; i++) {\n        cmp = this.subFolds[i].range.compare(row, column);\n        if (cmp != 1) break;\n      }\n      var afterStart = this.subFolds[i];\n      var firstConsumed = 0;\n      if (cmp == 0) {\n        if (afterStart.range.containsRange(fold))\n          return afterStart.addSubFold(fold);\n        else firstConsumed = 1;\n      }\n      var row = fold.range.end.row,\n        column = fold.range.end.column;\n      for (var j = i, cmp = -1; j < this.subFolds.length; j++) {\n        cmp = this.subFolds[j].range.compare(row, column);\n        if (cmp != 1) break;\n      }\n      if (cmp == 0) j++;\n      var consumedFolds = this.subFolds.splice(i, j - i, fold);\n      var last = cmp == 0 ? consumedFolds.length - 1 : consumedFolds.length;\n      for (var k = firstConsumed; k < last; k++) {\n        fold.addSubFold(consumedFolds[k]);\n      }\n      fold.setFoldLine(this.foldLine);\n      return fold;\n    };\n    Fold.prototype.restoreRange = function (range) {\n      return restoreRange(range, this.start);\n    };\n    return Fold;\n  })(RangeList);\n  function consumePoint(point, anchor) {\n    point.row -= anchor.row;\n    if (point.row == 0) point.column -= anchor.column;\n  }\n  function consumeRange(range, anchor) {\n    consumePoint(range.start, anchor);\n    consumePoint(range.end, anchor);\n  }\n  function restorePoint(point, anchor) {\n    if (point.row == 0) point.column += anchor.column;\n    point.row += anchor.row;\n  }\n  function restoreRange(range, anchor) {\n    restorePoint(range.start, anchor);\n    restorePoint(range.end, anchor);\n  }\n  exports.Fold = Fold;\n});\n\ndefine(\"ace/edit_session/folding\", [\n  \"require\",\n  \"exports\",\n  \"module\",\n  \"ace/range\",\n  \"ace/edit_session/fold_line\",\n  \"ace/edit_session/fold\",\n  \"ace/token_iterator\",\n  \"ace/mouse/mouse_event\",\n], function (require, exports, module) {\n  // @ts-nocheck\n  \"use strict\";\n  var Range = require(\"../range\").Range;\n  var FoldLine = require(\"./fold_line\").FoldLine;\n  var Fold = require(\"./fold\").Fold;\n  var TokenIterator = require(\"../token_iterator\").TokenIterator;\n  var MouseEvent = require(\"../mouse/mouse_event\").MouseEvent;\n  function Folding() {\n    this.getFoldAt = function (row, column, side) {\n      var foldLine = this.getFoldLine(row);\n      if (!foldLine) return null;\n      var folds = foldLine.folds;\n      for (var i = 0; i < folds.length; i++) {\n        var range = folds[i].range;\n        if (range.contains(row, column)) {\n          if (side == 1 && range.isEnd(row, column) && !range.isEmpty()) {\n            continue;\n          } else if (\n            side == -1 &&\n            range.isStart(row, column) &&\n            !range.isEmpty()\n          ) {\n            continue;\n          }\n          return folds[i];\n        }\n      }\n    };\n    this.getFoldsInRange = function (range) {\n      var start = range.start;\n      var end = range.end;\n      var foldLines = this.$foldData;\n      var foundFolds = [];\n      start.column += 1;\n      end.column -= 1;\n      for (var i = 0; i < foldLines.length; i++) {\n        var cmp = foldLines[i].range.compareRange(range);\n        if (cmp == 2) {\n          continue;\n        } else if (cmp == -2) {\n          break;\n        }\n        var folds = foldLines[i].folds;\n        for (var j = 0; j < folds.length; j++) {\n          var fold = folds[j];\n          cmp = fold.range.compareRange(range);\n          if (cmp == -2) {\n            break;\n          } else if (cmp == 2) {\n            continue;\n          } else if (cmp == 42) {\n            break;\n          }\n          foundFolds.push(fold);\n        }\n      }\n      start.column -= 1;\n      end.column += 1;\n      return foundFolds;\n    };\n    this.getFoldsInRangeList = function (ranges) {\n      if (Array.isArray(ranges)) {\n        var folds = [];\n        ranges.forEach(function (range) {\n          folds = folds.concat(this.getFoldsInRange(range));\n        }, this);\n      } else {\n        var folds = this.getFoldsInRange(ranges);\n      }\n      return folds;\n    };\n    this.getAllFolds = function () {\n      var folds = [];\n      var foldLines = this.$foldData;\n      for (var i = 0; i < foldLines.length; i++)\n        for (var j = 0; j < foldLines[i].folds.length; j++)\n          folds.push(foldLines[i].folds[j]);\n      return folds;\n    };\n    this.getFoldStringAt = function (row, column, trim, foldLine) {\n      foldLine = foldLine || this.getFoldLine(row);\n      if (!foldLine) return null;\n      var lastFold = {\n        end: { column: 0 },\n      };\n      var str, fold;\n      for (var i = 0; i < foldLine.folds.length; i++) {\n        fold = foldLine.folds[i];\n        var cmp = fold.range.compareEnd(row, column);\n        if (cmp == -1) {\n          str = this.getLine(fold.start.row).substring(\n            lastFold.end.column,\n            fold.start.column,\n          );\n          break;\n        } else if (cmp === 0) {\n          return null;\n        }\n        lastFold = fold;\n      }\n      if (!str)\n        str = this.getLine(fold.start.row).substring(lastFold.end.column);\n      if (trim == -1) return str.substring(0, column - lastFold.end.column);\n      else if (trim == 1) return str.substring(column - lastFold.end.column);\n      else return str;\n    };\n    this.getFoldLine = function (docRow, startFoldLine) {\n      var foldData = this.$foldData;\n      var i = 0;\n      if (startFoldLine) i = foldData.indexOf(startFoldLine);\n      if (i == -1) i = 0;\n      for (i; i < foldData.length; i++) {\n        var foldLine = foldData[i];\n        if (foldLine.start.row <= docRow && foldLine.end.row >= docRow) {\n          return foldLine;\n        } else if (foldLine.end.row > docRow) {\n          return null;\n        }\n      }\n      return null;\n    };\n    this.getNextFoldLine = function (docRow, startFoldLine) {\n      var foldData = this.$foldData;\n      var i = 0;\n      if (startFoldLine) i = foldData.indexOf(startFoldLine);\n      if (i == -1) i = 0;\n      for (i; i < foldData.length; i++) {\n        var foldLine = foldData[i];\n        if (foldLine.end.row >= docRow) {\n          return foldLine;\n        }\n      }\n      return null;\n    };\n    this.getFoldedRowCount = function (first, last) {\n      var foldData = this.$foldData,\n        rowCount = last - first + 1;\n      for (var i = 0; i < foldData.length; i++) {\n        var foldLine = foldData[i],\n          end = foldLine.end.row,\n          start = foldLine.start.row;\n        if (end >= last) {\n          if (start < last) {\n            if (start >= first) rowCount -= last - start;\n            else rowCount = 0; // in one fold\n          }\n          break;\n        } else if (end >= first) {\n          if (start >= first)\n            // fold inside range\n            rowCount -= end - start;\n          else rowCount -= end - first + 1;\n        }\n      }\n      return rowCount;\n    };\n    this.$addFoldLine = function (foldLine) {\n      this.$foldData.push(foldLine);\n      this.$foldData.sort(function (a, b) {\n        return a.start.row - b.start.row;\n      });\n      return foldLine;\n    };\n    this.addFold = function (placeholder, range) {\n      var foldData = this.$foldData;\n      var added = false;\n      var fold;\n      if (placeholder instanceof Fold) fold = placeholder;\n      else {\n        fold = new Fold(range, placeholder);\n        fold.collapseChildren = range.collapseChildren;\n      }\n      this.$clipRangeToDocument(fold.range);\n      var startRow = fold.start.row;\n      var startColumn = fold.start.column;\n      var endRow = fold.end.row;\n      var endColumn = fold.end.column;\n      var startFold = this.getFoldAt(startRow, startColumn, 1);\n      var endFold = this.getFoldAt(endRow, endColumn, -1);\n      if (startFold && endFold == startFold) return startFold.addSubFold(fold);\n      if (startFold && !startFold.range.isStart(startRow, startColumn))\n        this.removeFold(startFold);\n      if (endFold && !endFold.range.isEnd(endRow, endColumn))\n        this.removeFold(endFold);\n      var folds = this.getFoldsInRange(fold.range);\n      if (folds.length > 0) {\n        this.removeFolds(folds);\n        if (!fold.collapseChildren) {\n          folds.forEach(function (subFold) {\n            fold.addSubFold(subFold);\n          });\n        }\n      }\n      for (var i = 0; i < foldData.length; i++) {\n        var foldLine = foldData[i];\n        if (endRow == foldLine.start.row) {\n          foldLine.addFold(fold);\n          added = true;\n          break;\n        } else if (startRow == foldLine.end.row) {\n          foldLine.addFold(fold);\n          added = true;\n          if (!fold.sameRow) {\n            var foldLineNext = foldData[i + 1];\n            if (foldLineNext && foldLineNext.start.row == endRow) {\n              foldLine.merge(foldLineNext);\n              break;\n            }\n          }\n          break;\n        } else if (endRow <= foldLine.start.row) {\n          break;\n        }\n      }\n      if (!added)\n        foldLine = this.$addFoldLine(new FoldLine(this.$foldData, fold));\n      if (this.$useWrapMode)\n        this.$updateWrapData(foldLine.start.row, foldLine.start.row);\n      else this.$updateRowLengthCache(foldLine.start.row, foldLine.start.row);\n      this.$modified = true;\n      this._signal(\"changeFold\", { data: fold, action: \"add\" });\n      return fold;\n    };\n    this.addFolds = function (folds) {\n      folds.forEach(function (fold) {\n        this.addFold(fold);\n      }, this);\n    };\n    this.removeFold = function (fold) {\n      var foldLine = fold.foldLine;\n      var startRow = foldLine.start.row;\n      var endRow = foldLine.end.row;\n      var foldLines = this.$foldData;\n      var folds = foldLine.folds;\n      if (folds.length == 1) {\n        foldLines.splice(foldLines.indexOf(foldLine), 1);\n      } else if (foldLine.range.isEnd(fold.end.row, fold.end.column)) {\n        folds.pop();\n        foldLine.end.row = folds[folds.length - 1].end.row;\n        foldLine.end.column = folds[folds.length - 1].end.column;\n      } else if (foldLine.range.isStart(fold.start.row, fold.start.column)) {\n        folds.shift();\n        foldLine.start.row = folds[0].start.row;\n        foldLine.start.column = folds[0].start.column;\n      } else if (fold.sameRow) {\n        folds.splice(folds.indexOf(fold), 1);\n      } else {\n        var newFoldLine = foldLine.split(fold.start.row, fold.start.column);\n        folds = newFoldLine.folds;\n        folds.shift();\n        newFoldLine.start.row = folds[0].start.row;\n        newFoldLine.start.column = folds[0].start.column;\n      }\n      if (!this.$updating) {\n        if (this.$useWrapMode) this.$updateWrapData(startRow, endRow);\n        else this.$updateRowLengthCache(startRow, endRow);\n      }\n      this.$modified = true;\n      this._signal(\"changeFold\", { data: fold, action: \"remove\" });\n    };\n    this.removeFolds = function (folds) {\n      var cloneFolds = [];\n      for (var i = 0; i < folds.length; i++) {\n        cloneFolds.push(folds[i]);\n      }\n      cloneFolds.forEach(function (fold) {\n        this.removeFold(fold);\n      }, this);\n      this.$modified = true;\n    };\n    this.expandFold = function (fold) {\n      this.removeFold(fold);\n      fold.subFolds.forEach(function (subFold) {\n        fold.restoreRange(subFold);\n        this.addFold(subFold);\n      }, this);\n      if (fold.collapseChildren > 0) {\n        this.foldAll(\n          fold.start.row + 1,\n          fold.end.row,\n          fold.collapseChildren - 1,\n        );\n      }\n      fold.subFolds = [];\n    };\n    this.expandFolds = function (folds) {\n      folds.forEach(function (fold) {\n        this.expandFold(fold);\n      }, this);\n    };\n    this.unfold = function (location, expandInner) {\n      var range, folds;\n      if (location == null) {\n        range = new Range(0, 0, this.getLength(), 0);\n        if (expandInner == null) expandInner = true;\n      } else if (typeof location == \"number\") {\n        range = new Range(location, 0, location, this.getLine(location).length);\n      } else if (\"row\" in location) {\n        range = Range.fromPoints(location, location);\n      } else if (Array.isArray(location)) {\n        folds = [];\n        location.forEach(function (range) {\n          folds = folds.concat(this.unfold(range));\n        }, this);\n        return folds;\n      } else {\n        range = location;\n      }\n      folds = this.getFoldsInRangeList(range);\n      var outermostFolds = folds;\n      while (\n        folds.length == 1 &&\n        Range.comparePoints(folds[0].start, range.start) < 0 &&\n        Range.comparePoints(folds[0].end, range.end) > 0\n      ) {\n        this.expandFolds(folds);\n        folds = this.getFoldsInRangeList(range);\n      }\n      if (expandInner != false) {\n        this.removeFolds(folds);\n      } else {\n        this.expandFolds(folds);\n      }\n      if (outermostFolds.length) return outermostFolds;\n    };\n    this.isRowFolded = function (docRow, startFoldRow) {\n      return !!this.getFoldLine(docRow, startFoldRow);\n    };\n    this.getRowFoldEnd = function (docRow, startFoldRow) {\n      var foldLine = this.getFoldLine(docRow, startFoldRow);\n      return foldLine ? foldLine.end.row : docRow;\n    };\n    this.getRowFoldStart = function (docRow, startFoldRow) {\n      var foldLine = this.getFoldLine(docRow, startFoldRow);\n      return foldLine ? foldLine.start.row : docRow;\n    };\n    this.getFoldDisplayLine = function (\n      foldLine,\n      endRow,\n      endColumn,\n      startRow,\n      startColumn,\n    ) {\n      if (startRow == null) startRow = foldLine.start.row;\n      if (startColumn == null) startColumn = 0;\n      if (endRow == null) endRow = foldLine.end.row;\n      if (endColumn == null) endColumn = this.getLine(endRow).length;\n      var doc = this.doc;\n      var textLine = \"\";\n      foldLine.walk(\n        function (placeholder, row, column, lastColumn) {\n          if (row < startRow) return;\n          if (row == startRow) {\n            if (column < startColumn) return;\n            lastColumn = Math.max(startColumn, lastColumn);\n          }\n          if (placeholder != null) {\n            textLine += placeholder;\n          } else {\n            textLine += doc.getLine(row).substring(lastColumn, column);\n          }\n        },\n        endRow,\n        endColumn,\n      );\n      return textLine;\n    };\n    this.getDisplayLine = function (row, endColumn, startRow, startColumn) {\n      var foldLine = this.getFoldLine(row);\n      if (!foldLine) {\n        var line;\n        line = this.doc.getLine(row);\n        return line.substring(startColumn || 0, endColumn || line.length);\n      } else {\n        return this.getFoldDisplayLine(\n          foldLine,\n          row,\n          endColumn,\n          startRow,\n          startColumn,\n        );\n      }\n    };\n    this.$cloneFoldData = function () {\n      var fd = [];\n      fd = this.$foldData.map(function (foldLine) {\n        var folds = foldLine.folds.map(function (fold) {\n          return fold.clone();\n        });\n        return new FoldLine(fd, folds);\n      });\n      return fd;\n    };\n    this.toggleFold = function (tryToUnfold) {\n      var selection = this.selection;\n      var range = selection.getRange();\n      var fold;\n      var bracketPos;\n      if (range.isEmpty()) {\n        var cursor = range.start;\n        fold = this.getFoldAt(cursor.row, cursor.column);\n        if (fold) {\n          this.expandFold(fold);\n          return;\n        } else if ((bracketPos = this.findMatchingBracket(cursor))) {\n          if (range.comparePoint(bracketPos) == 1) {\n            range.end = bracketPos;\n          } else {\n            range.start = bracketPos;\n            range.start.column++;\n            range.end.column--;\n          }\n        } else if (\n          (bracketPos = this.findMatchingBracket({\n            row: cursor.row,\n            column: cursor.column + 1,\n          }))\n        ) {\n          if (range.comparePoint(bracketPos) == 1) range.end = bracketPos;\n          else range.start = bracketPos;\n          range.start.column++;\n        } else {\n          range = this.getCommentFoldRange(cursor.row, cursor.column) || range;\n        }\n      } else {\n        var folds = this.getFoldsInRange(range);\n        if (tryToUnfold && folds.length) {\n          this.expandFolds(folds);\n          return;\n        } else if (folds.length == 1) {\n          fold = folds[0];\n        }\n      }\n      if (!fold) fold = this.getFoldAt(range.start.row, range.start.column);\n      if (fold && fold.range.toString() == range.toString()) {\n        this.expandFold(fold);\n        return;\n      }\n      var placeholder = \"...\";\n      if (!range.isMultiLine()) {\n        placeholder = this.getTextRange(range);\n        if (placeholder.length < 4) return;\n        placeholder = placeholder.trim().substring(0, 2) + \"..\";\n      }\n      this.addFold(placeholder, range);\n    };\n    this.getCommentFoldRange = function (row, column, dir) {\n      var iterator = new TokenIterator(this, row, column);\n      var token = iterator.getCurrentToken();\n      var type = token && token.type;\n      if (token && /^comment|string/.test(type)) {\n        type = type.match(/comment|string/)[0];\n        if (type == \"comment\") type += \"|doc-start|\\\\.doc\";\n        var re = new RegExp(type);\n        var range = new Range();\n        if (dir != 1) {\n          do {\n            token = iterator.stepBackward();\n          } while (\n            token &&\n            re.test(token.type) &&\n            !/^comment.end/.test(token.type)\n          );\n          token = iterator.stepForward();\n        }\n        range.start.row = iterator.getCurrentTokenRow();\n        range.start.column =\n          iterator.getCurrentTokenColumn() +\n          (/^comment.start/.test(token.type) ? token.value.length : 2);\n        iterator = new TokenIterator(this, row, column);\n        if (dir != -1) {\n          var lastRow = -1;\n          do {\n            token = iterator.stepForward();\n            if (lastRow == -1) {\n              var state = this.getState(iterator.$row);\n              if (!re.test(state)) lastRow = iterator.$row;\n            } else if (iterator.$row > lastRow) {\n              break;\n            }\n          } while (\n            token &&\n            re.test(token.type) &&\n            !/^comment.start/.test(token.type)\n          );\n          token = iterator.stepBackward();\n        } else token = iterator.getCurrentToken();\n        range.end.row = iterator.getCurrentTokenRow();\n        range.end.column = iterator.getCurrentTokenColumn();\n        if (!/^comment.end/.test(token.type)) {\n          range.end.column += token.value.length - 2;\n        }\n        return range;\n      }\n    };\n    this.foldAll = function (startRow, endRow, depth, test) {\n      if (depth == undefined) depth = 100000; // JSON.stringify doesn't hanle Infinity\n      var foldWidgets = this.foldWidgets;\n      if (!foldWidgets) return; // mode doesn't support folding\n      endRow = endRow || this.getLength();\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\") continue;\n        if (test && !test(row)) continue;\n        var range = this.getFoldWidgetRange(row);\n        if (\n          range &&\n          range.isMultiLine() &&\n          range.end.row <= endRow &&\n          range.start.row >= startRow\n        ) {\n          row = range.end.row;\n          range.collapseChildren = depth;\n          this.addFold(\"...\", range);\n        }\n      }\n    };\n    this.foldToLevel = function (level) {\n      this.foldAll();\n      while (level-- > 0) this.unfold(null, false);\n    };\n    this.foldAllComments = function () {\n      var session = this;\n      this.foldAll(null, null, null, function (row) {\n        var tokens = session.getTokens(row);\n        for (var i = 0; i < tokens.length; i++) {\n          var token = tokens[i];\n          if (token.type == \"text\" && /^\\s+$/.test(token.value)) continue;\n          if (/comment/.test(token.type)) return true;\n          return false;\n        }\n      });\n    };\n    this.$foldStyles = {\n      manual: 1,\n      markbegin: 1,\n      markbeginend: 1,\n    };\n    this.$foldStyle = \"markbegin\";\n    this.setFoldStyle = function (style) {\n      if (!this.$foldStyles[style])\n        throw new Error(\n          \"invalid fold style: \" +\n            style +\n            \"[\" +\n            Object.keys(this.$foldStyles).join(\", \") +\n            \"]\",\n        );\n      if (this.$foldStyle == style) return;\n      this.$foldStyle = style;\n      if (style == \"manual\") this.unfold();\n      var mode = this.$foldMode;\n      this.$setFolding(null);\n      this.$setFolding(mode);\n    };\n    this.$setFolding = function (foldMode) {\n      if (this.$foldMode == foldMode) return;\n      this.$foldMode = foldMode;\n      this.off(\"change\", this.$updateFoldWidgets);\n      this.off(\"tokenizerUpdate\", this.$tokenizerUpdateFoldWidgets);\n      this._signal(\"changeAnnotation\");\n      if (!foldMode || this.$foldStyle == \"manual\") {\n        this.foldWidgets = null;\n        return;\n      }\n      this.foldWidgets = [];\n      this.getFoldWidget = foldMode.getFoldWidget.bind(\n        foldMode,\n        this,\n        this.$foldStyle,\n      );\n      this.getFoldWidgetRange = foldMode.getFoldWidgetRange.bind(\n        foldMode,\n        this,\n        this.$foldStyle,\n      );\n      this.$updateFoldWidgets = this.updateFoldWidgets.bind(this);\n      this.$tokenizerUpdateFoldWidgets =\n        this.tokenizerUpdateFoldWidgets.bind(this);\n      this.on(\"change\", this.$updateFoldWidgets);\n      this.on(\"tokenizerUpdate\", this.$tokenizerUpdateFoldWidgets);\n    };\n    this.getParentFoldRangeData = function (row, ignoreCurrent) {\n      var fw = this.foldWidgets;\n      if (!fw || (ignoreCurrent && fw[row])) return {};\n      var i = row - 1,\n        firstRange;\n      while (i >= 0) {\n        var c = fw[i];\n        if (c == null) c = fw[i] = this.getFoldWidget(i);\n        if (c == \"start\") {\n          var range = this.getFoldWidgetRange(i);\n          if (!firstRange) firstRange = range;\n          if (range && range.end.row >= row) break;\n        }\n        i--;\n      }\n      return {\n        range: i !== -1 && range,\n        firstRange: firstRange,\n      };\n    };\n    this.onFoldWidgetClick = function (row, e) {\n      if (e instanceof MouseEvent) e = e.domEvent;\n      var options = {\n        children: e.shiftKey,\n        all: e.ctrlKey || e.metaKey,\n        siblings: e.altKey,\n      };\n      var range = this.$toggleFoldWidget(row, options);\n      if (!range) {\n        var el = e.target || e.srcElement;\n        if (el && /ace_fold-widget/.test(el.className))\n          el.className += \" ace_invalid\";\n      }\n    };\n    this.$toggleFoldWidget = function (row, options) {\n      if (!this.getFoldWidget) return;\n      var type = this.getFoldWidget(row);\n      var line = this.getLine(row);\n      var dir = type === \"end\" ? -1 : 1;\n      var fold = this.getFoldAt(row, dir === -1 ? 0 : line.length, dir);\n      if (fold) {\n        if (options.children || options.all) this.removeFold(fold);\n        else this.expandFold(fold);\n        return fold;\n      }\n      var range = this.getFoldWidgetRange(row, true);\n      if (range && !range.isMultiLine()) {\n        fold = this.getFoldAt(range.start.row, range.start.column, 1);\n        if (fold && range.isEqual(fold.range)) {\n          this.removeFold(fold);\n          return fold;\n        }\n      }\n      if (options.siblings) {\n        var data = this.getParentFoldRangeData(row);\n        if (data.range) {\n          var startRow = data.range.start.row + 1;\n          var endRow = data.range.end.row;\n        }\n        this.foldAll(startRow, endRow, options.all ? 10000 : 0);\n      } else if (options.children) {\n        endRow = range ? range.end.row : this.getLength();\n        this.foldAll(row + 1, endRow, options.all ? 10000 : 0);\n      } else if (range) {\n        if (options.all) range.collapseChildren = 10000;\n        this.addFold(\"...\", range);\n      }\n      return range;\n    };\n    this.toggleFoldWidget = function (toggleParent) {\n      var row = this.selection.getCursor().row;\n      row = this.getRowFoldStart(row);\n      var range = this.$toggleFoldWidget(row, {});\n      if (range) return;\n      var data = this.getParentFoldRangeData(row, true);\n      range = data.range || data.firstRange;\n      if (range) {\n        row = range.start.row;\n        var fold = this.getFoldAt(row, this.getLine(row).length, 1);\n        if (fold) {\n          this.removeFold(fold);\n        } else {\n          this.addFold(\"...\", range);\n        }\n      }\n    };\n    this.updateFoldWidgets = function (delta) {\n      var firstRow = delta.start.row;\n      var len = delta.end.row - firstRow;\n      if (len === 0) {\n        this.foldWidgets[firstRow] = null;\n      } else if (delta.action == \"remove\") {\n        this.foldWidgets.splice(firstRow, len + 1, null);\n      } else {\n        var args = Array(len + 1);\n        args.unshift(firstRow, 1);\n        this.foldWidgets.splice.apply(this.foldWidgets, args);\n      }\n    };\n    this.tokenizerUpdateFoldWidgets = function (e) {\n      var rows = e.data;\n      if (rows.first != rows.last) {\n        if (this.foldWidgets.length > rows.first)\n          this.foldWidgets.splice(rows.first, this.foldWidgets.length);\n      }\n    };\n  }\n  exports.Folding = Folding;\n});\n\ndefine(\"ace/edit_session/bracket_match\", [\n  \"require\",\n  \"exports\",\n  \"module\",\n  \"ace/token_iterator\",\n  \"ace/range\",\n], function (require, exports, module) {\n  \"use strict\";\n  var TokenIterator = require(\"../token_iterator\").TokenIterator;\n  var Range = require(\"../range\").Range;\n  function BracketMatch() {\n    this.findMatchingBracket = function (position, chr) {\n      if (position.column == 0) return null;\n      var charBeforeCursor =\n        chr || this.getLine(position.row).charAt(position.column - 1);\n      if (charBeforeCursor == \"\") return null;\n      var match = charBeforeCursor.match(/([\\(\\[\\{])|([\\)\\]\\}])/);\n      if (!match) return null;\n      if (match[1]) return this.$findClosingBracket(match[1], position);\n      else return this.$findOpeningBracket(match[2], position);\n    };\n    this.getBracketRange = function (pos) {\n      var line = this.getLine(pos.row);\n      var before = true,\n        range;\n      var chr = line.charAt(pos.column - 1);\n      var match = chr && chr.match(/([\\(\\[\\{])|([\\)\\]\\}])/);\n      if (!match) {\n        chr = line.charAt(pos.column);\n        pos = { row: pos.row, column: pos.column + 1 };\n        match = chr && chr.match(/([\\(\\[\\{])|([\\)\\]\\}])/);\n        before = false;\n      }\n      if (!match) return null;\n      if (match[1]) {\n        var bracketPos = this.$findClosingBracket(match[1], pos);\n        if (!bracketPos) return null;\n        range = Range.fromPoints(pos, bracketPos);\n        if (!before) {\n          range.end.column++;\n          range.start.column--;\n        }\n        range.cursor = range.end;\n      } else {\n        var bracketPos = this.$findOpeningBracket(match[2], pos);\n        if (!bracketPos) return null;\n        range = Range.fromPoints(bracketPos, pos);\n        if (!before) {\n          range.start.column++;\n          range.end.column--;\n        }\n        range.cursor = range.start;\n      }\n      return range;\n    };\n    this.getMatchingBracketRanges = function (pos, isBackwards) {\n      var line = this.getLine(pos.row);\n      var bracketsRegExp = /([\\(\\[\\{])|([\\)\\]\\}])/;\n      var chr = !isBackwards && line.charAt(pos.column - 1);\n      var match = chr && chr.match(bracketsRegExp);\n      if (!match) {\n        chr =\n          (isBackwards === undefined || isBackwards) && line.charAt(pos.column);\n        pos = {\n          row: pos.row,\n          column: pos.column + 1,\n        };\n        match = chr && chr.match(bracketsRegExp);\n      }\n      if (!match) return null;\n      var startRange = new Range(pos.row, pos.column - 1, pos.row, pos.column);\n      var bracketPos = match[1]\n        ? this.$findClosingBracket(match[1], pos)\n        : this.$findOpeningBracket(match[2], pos);\n      if (!bracketPos) return [startRange];\n      var endRange = new Range(\n        bracketPos.row,\n        bracketPos.column,\n        bracketPos.row,\n        bracketPos.column + 1,\n      );\n      return [startRange, endRange];\n    };\n    this.$brackets = {\n      \")\": \"(\",\n      \"(\": \")\",\n      \"]\": \"[\",\n      \"[\": \"]\",\n      \"{\": \"}\",\n      \"}\": \"{\",\n      \"<\": \">\",\n      \">\": \"<\",\n    };\n    this.$findOpeningBracket = function (bracket, position, typeRe) {\n      var openBracket = this.$brackets[bracket];\n      var depth = 1;\n      var iterator = new TokenIterator(this, position.row, position.column);\n      var token = iterator.getCurrentToken();\n      if (!token) token = iterator.stepForward();\n      if (!token) return;\n      if (!typeRe) {\n        typeRe = new RegExp(\n          \"(\\\\.?\" +\n            token.type\n              .replace(\".\", \"\\\\.\")\n              .replace(\"rparen\", \".paren\")\n              .replace(/\\b(?:end)\\b/, \"(?:start|begin|end)\")\n              .replace(/-close\\b/, \"-(close|open)\") +\n            \")+\",\n        );\n      }\n      var valueIndex = position.column - iterator.getCurrentTokenColumn() - 2;\n      var value = token.value;\n      while (true) {\n        while (valueIndex >= 0) {\n          var chr = value.charAt(valueIndex);\n          if (chr == openBracket) {\n            depth -= 1;\n            if (depth == 0) {\n              return {\n                row: iterator.getCurrentTokenRow(),\n                column: valueIndex + iterator.getCurrentTokenColumn(),\n              };\n            }\n          } else if (chr == bracket) {\n            depth += 1;\n          }\n          valueIndex -= 1;\n        }\n        do {\n          token = iterator.stepBackward();\n        } while (token && !typeRe.test(token.type));\n        if (token == null) break;\n        value = token.value;\n        valueIndex = value.length - 1;\n      }\n      return null;\n    };\n    this.$findClosingBracket = function (bracket, position, typeRe) {\n      var closingBracket = this.$brackets[bracket];\n      var depth = 1;\n      var iterator = new TokenIterator(this, position.row, position.column);\n      var token = iterator.getCurrentToken();\n      if (!token) token = iterator.stepForward();\n      if (!token) return;\n      if (!typeRe) {\n        typeRe = new RegExp(\n          \"(\\\\.?\" +\n            token.type\n              .replace(\".\", \"\\\\.\")\n              .replace(\"lparen\", \".paren\")\n              .replace(/\\b(?:start|begin)\\b/, \"(?:start|begin|end)\")\n              .replace(/-open\\b/, \"-(close|open)\") +\n            \")+\",\n        );\n      }\n      var valueIndex = position.column - iterator.getCurrentTokenColumn();\n      while (true) {\n        var value = token.value;\n        var valueLength = value.length;\n        while (valueIndex < valueLength) {\n          var chr = value.charAt(valueIndex);\n          if (chr == closingBracket) {\n            depth -= 1;\n            if (depth == 0) {\n              return {\n                row: iterator.getCurrentTokenRow(),\n                column: valueIndex + iterator.getCurrentTokenColumn(),\n              };\n            }\n          } else if (chr == bracket) {\n            depth += 1;\n          }\n          valueIndex += 1;\n        }\n        do {\n          token = iterator.stepForward();\n        } while (token && !typeRe.test(token.type));\n        if (token == null) break;\n        valueIndex = 0;\n      }\n      return null;\n    };\n    this.getMatchingTags = function (pos) {\n      var iterator = new TokenIterator(this, pos.row, pos.column);\n      var token = this.$findTagName(iterator);\n      if (!token) return;\n      var prevToken = iterator.stepBackward();\n      if (prevToken.value === \"<\") {\n        return this.$findClosingTag(iterator, token);\n      } else {\n        return this.$findOpeningTag(iterator, token);\n      }\n    };\n    this.$findTagName = function (iterator) {\n      var token = iterator.getCurrentToken();\n      var found = false;\n      var backward = false;\n      if (token && token.type.indexOf(\"tag-name\") === -1) {\n        do {\n          if (backward) token = iterator.stepBackward();\n          else token = iterator.stepForward();\n          if (token) {\n            if (token.value === \"/>\") {\n              backward = true;\n            } else if (token.type.indexOf(\"tag-name\") !== -1) {\n              found = true;\n            }\n          }\n        } while (token && !found);\n      }\n      return token;\n    };\n    this.$findClosingTag = function (iterator, token) {\n      var prevToken;\n      var currentTag = token.value;\n      var tag = token.value;\n      var depth = 0;\n      var openTagStart = new Range(\n        iterator.getCurrentTokenRow(),\n        iterator.getCurrentTokenColumn(),\n        iterator.getCurrentTokenRow(),\n        iterator.getCurrentTokenColumn() + 1,\n      );\n      token = iterator.stepForward();\n      var openTagName = new Range(\n        iterator.getCurrentTokenRow(),\n        iterator.getCurrentTokenColumn(),\n        iterator.getCurrentTokenRow(),\n        iterator.getCurrentTokenColumn() + token.value.length,\n      );\n      var foundOpenTagEnd = false;\n      do {\n        prevToken = token;\n        token = iterator.stepForward();\n        if (token) {\n          if (token.value === \">\" && !foundOpenTagEnd) {\n            var openTagEnd = new Range(\n              iterator.getCurrentTokenRow(),\n              iterator.getCurrentTokenColumn(),\n              iterator.getCurrentTokenRow(),\n              iterator.getCurrentTokenColumn() + 1,\n            ); //Range for `>`\n            foundOpenTagEnd = true;\n          }\n          if (token.type.indexOf(\"tag-name\") !== -1) {\n            currentTag = token.value;\n            if (tag === currentTag) {\n              if (prevToken.value === \"<\") {\n                depth++;\n              } else if (prevToken.value === \"</\") {\n                depth--;\n                if (depth < 0) {\n                  //found closing tag\n                  iterator.stepBackward();\n                  var closeTagStart = new Range(\n                    iterator.getCurrentTokenRow(),\n                    iterator.getCurrentTokenColumn(),\n                    iterator.getCurrentTokenRow(),\n                    iterator.getCurrentTokenColumn() + 2,\n                  ); //Range for </\n                  token = iterator.stepForward();\n                  var closeTagName = new Range(\n                    iterator.getCurrentTokenRow(),\n                    iterator.getCurrentTokenColumn(),\n                    iterator.getCurrentTokenRow(),\n                    iterator.getCurrentTokenColumn() + token.value.length,\n                  );\n                  token = iterator.stepForward();\n                  if (token && token.value === \">\") {\n                    var closeTagEnd = new Range(\n                      iterator.getCurrentTokenRow(),\n                      iterator.getCurrentTokenColumn(),\n                      iterator.getCurrentTokenRow(),\n                      iterator.getCurrentTokenColumn() + 1,\n                    ); //Range for >\n                  } else {\n                    return;\n                  }\n                }\n              }\n            }\n          } else if (tag === currentTag && token.value === \"/>\") {\n            // self-closing tag\n            depth--;\n            if (depth < 0) {\n              //found self-closing tag end\n              var closeTagStart = new Range(\n                iterator.getCurrentTokenRow(),\n                iterator.getCurrentTokenColumn(),\n                iterator.getCurrentTokenRow(),\n                iterator.getCurrentTokenColumn() + 2,\n              );\n              var closeTagName = closeTagStart;\n              var closeTagEnd = closeTagName;\n              var openTagEnd = new Range(\n                openTagName.end.row,\n                openTagName.end.column,\n                openTagName.end.row,\n                openTagName.end.column + 1,\n              );\n            }\n          }\n        }\n      } while (token && depth >= 0);\n      if (\n        openTagStart &&\n        openTagEnd &&\n        closeTagStart &&\n        closeTagEnd &&\n        openTagName &&\n        closeTagName\n      ) {\n        return {\n          openTag: new Range(\n            openTagStart.start.row,\n            openTagStart.start.column,\n            openTagEnd.end.row,\n            openTagEnd.end.column,\n          ),\n          closeTag: new Range(\n            closeTagStart.start.row,\n            closeTagStart.start.column,\n            closeTagEnd.end.row,\n            closeTagEnd.end.column,\n          ),\n          openTagName: openTagName,\n          closeTagName: closeTagName,\n        };\n      }\n    };\n    this.$findOpeningTag = function (iterator, token) {\n      var prevToken = iterator.getCurrentToken();\n      var tag = token.value;\n      var depth = 0;\n      var startRow = iterator.getCurrentTokenRow();\n      var startColumn = iterator.getCurrentTokenColumn();\n      var endColumn = startColumn + 2;\n      var closeTagStart = new Range(startRow, startColumn, startRow, endColumn); //Range for </\n      iterator.stepForward();\n      var closeTagName = new Range(\n        iterator.getCurrentTokenRow(),\n        iterator.getCurrentTokenColumn(),\n        iterator.getCurrentTokenRow(),\n        iterator.getCurrentTokenColumn() + token.value.length,\n      );\n      token = iterator.stepForward();\n      if (!token || token.value !== \">\") return;\n      var closeTagEnd = new Range(\n        iterator.getCurrentTokenRow(),\n        iterator.getCurrentTokenColumn(),\n        iterator.getCurrentTokenRow(),\n        iterator.getCurrentTokenColumn() + 1,\n      ); //Range for >\n      iterator.stepBackward();\n      iterator.stepBackward();\n      do {\n        token = prevToken;\n        startRow = iterator.getCurrentTokenRow();\n        startColumn = iterator.getCurrentTokenColumn();\n        endColumn = startColumn + token.value.length;\n        prevToken = iterator.stepBackward();\n        if (token) {\n          if (token.type.indexOf(\"tag-name\") !== -1) {\n            if (tag === token.value) {\n              if (prevToken.value === \"<\") {\n                depth++;\n                if (depth > 0) {\n                  //found opening tag\n                  var openTagName = new Range(\n                    startRow,\n                    startColumn,\n                    startRow,\n                    endColumn,\n                  );\n                  var openTagStart = new Range(\n                    iterator.getCurrentTokenRow(),\n                    iterator.getCurrentTokenColumn(),\n                    iterator.getCurrentTokenRow(),\n                    iterator.getCurrentTokenColumn() + 1,\n                  ); //Range for <\n                  do {\n                    token = iterator.stepForward();\n                  } while (token && token.value !== \">\");\n                  var openTagEnd = new Range(\n                    iterator.getCurrentTokenRow(),\n                    iterator.getCurrentTokenColumn(),\n                    iterator.getCurrentTokenRow(),\n                    iterator.getCurrentTokenColumn() + 1,\n                  ); //Range for >\n                }\n              } else if (prevToken.value === \"</\") {\n                depth--;\n              }\n            }\n          } else if (token.value === \"/>\") {\n            // self-closing tag\n            var stepCount = 0;\n            var tmpToken = prevToken;\n            while (tmpToken) {\n              if (\n                tmpToken.type.indexOf(\"tag-name\") !== -1 &&\n                tmpToken.value === tag\n              ) {\n                depth--;\n                break;\n              } else if (tmpToken.value === \"<\") {\n                break;\n              }\n              tmpToken = iterator.stepBackward();\n              stepCount++;\n            }\n            for (var i = 0; i < stepCount; i++) {\n              iterator.stepForward();\n            }\n          }\n        }\n      } while (prevToken && depth <= 0);\n      if (\n        openTagStart &&\n        openTagEnd &&\n        closeTagStart &&\n        closeTagEnd &&\n        openTagName &&\n        closeTagName\n      ) {\n        return {\n          openTag: new Range(\n            openTagStart.start.row,\n            openTagStart.start.column,\n            openTagEnd.end.row,\n            openTagEnd.end.column,\n          ),\n          closeTag: new Range(\n            closeTagStart.start.row,\n            closeTagStart.start.column,\n            closeTagEnd.end.row,\n            closeTagEnd.end.column,\n          ),\n          openTagName: openTagName,\n          closeTagName: closeTagName,\n        };\n      }\n    };\n  }\n  exports.BracketMatch = BracketMatch;\n});\n\ndefine(\"ace/edit_session\", [\n  \"require\",\n  \"exports\",\n  \"module\",\n  \"ace/lib/oop\",\n  \"ace/lib/lang\",\n  \"ace/bidihandler\",\n  \"ace/config\",\n  \"ace/lib/event_emitter\",\n  \"ace/selection\",\n  \"ace/mode/text\",\n  \"ace/range\",\n  \"ace/document\",\n  \"ace/background_tokenizer\",\n  \"ace/search_highlight\",\n  \"ace/undomanager\",\n  \"ace/edit_session/folding\",\n  \"ace/edit_session/bracket_match\",\n], function (require, exports, module) {\n  \"use strict\";\n  var oop = require(\"./lib/oop\");\n  var lang = require(\"./lib/lang\");\n  var BidiHandler = require(\"./bidihandler\").BidiHandler;\n  var config = require(\"./config\");\n  var EventEmitter = require(\"./lib/event_emitter\").EventEmitter;\n  var Selection = require(\"./selection\").Selection;\n  var TextMode = require(\"./mode/text\").Mode;\n  var Range = require(\"./range\").Range;\n  var Document = require(\"./document\").Document;\n  var BackgroundTokenizer =\n    require(\"./background_tokenizer\").BackgroundTokenizer;\n  var SearchHighlight = require(\"./search_highlight\").SearchHighlight;\n  var UndoManager = require(\"./undomanager\").UndoManager;\n  var EditSession = /** @class */ (function () {\n    function EditSession(text, mode) {\n      this.doc;\n      this.$breakpoints = [];\n      this.$decorations = [];\n      this.$frontMarkers = {};\n      this.$backMarkers = {};\n      this.$markerId = 1;\n      this.$undoSelect = true;\n      this.$foldData = [];\n      this.id = \"session\" + ++EditSession.$uid;\n      this.$foldData.toString = function () {\n        return this.join(\"\\n\");\n      };\n      this.bgTokenizer = new BackgroundTokenizer(\n        new TextMode().getTokenizer(),\n        this,\n      );\n      var _self = this;\n      this.bgTokenizer.on(\"update\", function (e) {\n        _self._signal(\"tokenizerUpdate\", e);\n      });\n      this.on(\"changeFold\", this.onChangeFold.bind(this));\n      this.$onChange = this.onChange.bind(this);\n      if (typeof text != \"object\" || !text.getLine)\n        text = new Document(/**@type{string}*/ (text));\n      this.setDocument(text);\n      this.selection = new Selection(this);\n      this.$bidiHandler = new BidiHandler(this);\n      config.resetOptions(this);\n      this.setMode(mode);\n      config._signal(\"session\", this);\n      this.destroyed = false;\n    }\n    EditSession.prototype.setDocument = function (doc) {\n      if (this.doc) this.doc.off(\"change\", this.$onChange);\n      this.doc = doc;\n      doc.on(\"change\", this.$onChange, true);\n      this.bgTokenizer.setDocument(this.getDocument());\n      this.resetCaches();\n    };\n    EditSession.prototype.getDocument = function () {\n      return this.doc;\n    };\n    EditSession.prototype.$resetRowCache = function (docRow) {\n      if (!docRow) {\n        this.$docRowCache = [];\n        this.$screenRowCache = [];\n        return;\n      }\n      var l = this.$docRowCache.length;\n      var i = this.$getRowCacheIndex(this.$docRowCache, docRow) + 1;\n      if (l > i) {\n        this.$docRowCache.splice(i, l);\n        this.$screenRowCache.splice(i, l);\n      }\n    };\n    EditSession.prototype.$getRowCacheIndex = function (cacheArray, val) {\n      var low = 0;\n      var hi = cacheArray.length - 1;\n      while (low <= hi) {\n        var mid = (low + hi) >> 1;\n        var c = cacheArray[mid];\n        if (val > c) low = mid + 1;\n        else if (val < c) hi = mid - 1;\n        else return mid;\n      }\n      return low - 1;\n    };\n    EditSession.prototype.resetCaches = function () {\n      this.$modified = true;\n      this.$wrapData = [];\n      this.$rowLengthCache = [];\n      this.$resetRowCache(0);\n      if (!this.destroyed) this.bgTokenizer.start(0);\n    };\n    EditSession.prototype.onChangeFold = function (e) {\n      var fold = e.data;\n      this.$resetRowCache(fold.start.row);\n    };\n    EditSession.prototype.onChange = function (delta) {\n      this.$modified = true;\n      this.$bidiHandler.onChange(delta);\n      this.$resetRowCache(delta.start.row);\n      var removedFolds = this.$updateInternalDataOnChange(delta);\n      if (!this.$fromUndo && this.$undoManager) {\n        if (removedFolds && removedFolds.length) {\n          this.$undoManager.add(\n            {\n              action: \"removeFolds\",\n              folds: removedFolds,\n            },\n            this.mergeUndoDeltas,\n          );\n          this.mergeUndoDeltas = true;\n        }\n        this.$undoManager.add(delta, this.mergeUndoDeltas);\n        this.mergeUndoDeltas = true;\n        this.$informUndoManager.schedule();\n      }\n      this.bgTokenizer.$updateOnChange(delta);\n      this._signal(\"change\", delta);\n    };\n    EditSession.prototype.setValue = function (text) {\n      this.doc.setValue(text);\n      this.selection.moveTo(0, 0);\n      this.$resetRowCache(0);\n      this.setUndoManager(this.$undoManager);\n      this.getUndoManager().reset();\n    };\n    EditSession.fromJSON = function (session) {\n      if (typeof session == \"string\") session = JSON.parse(session);\n      var undoManager = new UndoManager();\n      undoManager.$undoStack = session.history.undo;\n      undoManager.$redoStack = session.history.redo;\n      undoManager.mark = session.history.mark;\n      undoManager.$rev = session.history.rev;\n      var editSession = new EditSession(session.value);\n      session.folds.forEach(function (fold) {\n        editSession.addFold(\"...\", Range.fromPoints(fold.start, fold.end));\n      });\n      editSession.setAnnotations(session.annotations);\n      editSession.setBreakpoints(session.breakpoints);\n      editSession.setMode(session.mode);\n      editSession.setScrollLeft(session.scrollLeft);\n      editSession.setScrollTop(session.scrollTop);\n      editSession.setUndoManager(undoManager);\n      editSession.selection.fromJSON(session.selection);\n      return editSession;\n    };\n    EditSession.prototype.toJSON = function () {\n      return {\n        annotations: this.$annotations,\n        breakpoints: this.$breakpoints,\n        folds: this.getAllFolds().map(function (fold) {\n          return fold.range;\n        }),\n        history: this.getUndoManager(),\n        mode: this.$mode.$id,\n        scrollLeft: this.$scrollLeft,\n        scrollTop: this.$scrollTop,\n        selection: this.selection.toJSON(),\n        value: this.doc.getValue(),\n      };\n    };\n    EditSession.prototype.toString = function () {\n      return this.doc.getValue();\n    };\n    EditSession.prototype.getSelection = function () {\n      return this.selection;\n    };\n    EditSession.prototype.getState = function (row) {\n      return this.bgTokenizer.getState(row);\n    };\n    EditSession.prototype.getTokens = function (row) {\n      return this.bgTokenizer.getTokens(row);\n    };\n    EditSession.prototype.getTokenAt = function (row, column) {\n      var tokens = this.bgTokenizer.getTokens(row);\n      var token,\n        c = 0;\n      if (column == null) {\n        var i = tokens.length - 1;\n        c = this.getLine(row).length;\n      } else {\n        for (var i = 0; i < tokens.length; i++) {\n          c += tokens[i].value.length;\n          if (c >= column) break;\n        }\n      }\n      token = tokens[i];\n      if (!token) return null;\n      token.index = i;\n      token.start = c - token.value.length;\n      return token;\n    };\n    EditSession.prototype.setUndoManager = function (undoManager) {\n      this.$undoManager = undoManager;\n      if (this.$informUndoManager) this.$informUndoManager.cancel();\n      if (undoManager) {\n        var self = this;\n        undoManager.addSession(this);\n        this.$syncInformUndoManager = function () {\n          self.$informUndoManager.cancel();\n          self.mergeUndoDeltas = false;\n        };\n        this.$informUndoManager = lang.delayedCall(this.$syncInformUndoManager);\n      } else {\n        this.$syncInformUndoManager = function () {};\n      }\n    };\n    EditSession.prototype.markUndoGroup = function () {\n      if (this.$syncInformUndoManager) this.$syncInformUndoManager();\n    };\n    EditSession.prototype.getUndoManager = function () {\n      return this.$undoManager || this.$defaultUndoManager;\n    };\n    EditSession.prototype.getTabString = function () {\n      if (this.getUseSoftTabs()) {\n        return lang.stringRepeat(\" \", this.getTabSize());\n      } else {\n        return \"\\t\";\n      }\n    };\n    EditSession.prototype.setUseSoftTabs = function (val) {\n      this.setOption(\"useSoftTabs\", val);\n    };\n    EditSession.prototype.getUseSoftTabs = function () {\n      return this.$useSoftTabs && !this.$mode.$indentWithTabs;\n    };\n    EditSession.prototype.setTabSize = function (tabSize) {\n      this.setOption(\"tabSize\", tabSize);\n    };\n    EditSession.prototype.getTabSize = function () {\n      return this.$tabSize;\n    };\n    EditSession.prototype.isTabStop = function (position) {\n      return this.$useSoftTabs && position.column % this.$tabSize === 0;\n    };\n    EditSession.prototype.setNavigateWithinSoftTabs = function (\n      navigateWithinSoftTabs,\n    ) {\n      this.setOption(\"navigateWithinSoftTabs\", navigateWithinSoftTabs);\n    };\n    EditSession.prototype.getNavigateWithinSoftTabs = function () {\n      return this.$navigateWithinSoftTabs;\n    };\n    EditSession.prototype.setOverwrite = function (overwrite) {\n      this.setOption(\"overwrite\", overwrite);\n    };\n    EditSession.prototype.getOverwrite = function () {\n      return this.$overwrite;\n    };\n    EditSession.prototype.toggleOverwrite = function () {\n      this.setOverwrite(!this.$overwrite);\n    };\n    EditSession.prototype.addGutterDecoration = function (row, className) {\n      if (!this.$decorations[row]) this.$decorations[row] = \"\";\n      this.$decorations[row] += \" \" + className;\n      this._signal(\"changeBreakpoint\", {});\n    };\n    EditSession.prototype.removeGutterDecoration = function (row, className) {\n      this.$decorations[row] = (this.$decorations[row] || \"\").replace(\n        \" \" + className,\n        \"\",\n      );\n      this._signal(\"changeBreakpoint\", {});\n    };\n    EditSession.prototype.getBreakpoints = function () {\n      return this.$breakpoints;\n    };\n    EditSession.prototype.setBreakpoints = function (rows) {\n      this.$breakpoints = [];\n      for (var i = 0; i < rows.length; i++) {\n        this.$breakpoints[rows[i]] = \"ace_breakpoint\";\n      }\n      this._signal(\"changeBreakpoint\", {});\n    };\n    EditSession.prototype.clearBreakpoints = function () {\n      this.$breakpoints = [];\n      this._signal(\"changeBreakpoint\", {});\n    };\n    EditSession.prototype.setBreakpoint = function (row, className) {\n      if (className === undefined) className = \"ace_breakpoint\";\n      if (className) this.$breakpoints[row] = className;\n      else delete this.$breakpoints[row];\n      this._signal(\"changeBreakpoint\", {});\n    };\n    EditSession.prototype.clearBreakpoint = function (row) {\n      delete this.$breakpoints[row];\n      this._signal(\"changeBreakpoint\", {});\n    };\n    EditSession.prototype.addMarker = function (range, clazz, type, inFront) {\n      var id = this.$markerId++;\n      var marker = {\n        range: range,\n        type: type || \"line\",\n        renderer: typeof type == \"function\" ? type : null,\n        clazz: clazz,\n        inFront: !!inFront,\n        id: id,\n      };\n      if (inFront) {\n        this.$frontMarkers[id] = marker;\n        this._signal(\"changeFrontMarker\");\n      } else {\n        this.$backMarkers[id] = marker;\n        this._signal(\"changeBackMarker\");\n      }\n      return id;\n    };\n    EditSession.prototype.addDynamicMarker = function (marker, inFront) {\n      if (!marker.update) return;\n      var id = this.$markerId++;\n      marker.id = id;\n      marker.inFront = !!inFront;\n      if (inFront) {\n        this.$frontMarkers[id] = marker;\n        this._signal(\"changeFrontMarker\");\n      } else {\n        this.$backMarkers[id] = marker;\n        this._signal(\"changeBackMarker\");\n      }\n      return marker;\n    };\n    EditSession.prototype.removeMarker = function (markerId) {\n      var marker = this.$frontMarkers[markerId] || this.$backMarkers[markerId];\n      if (!marker) return;\n      var markers = marker.inFront ? this.$frontMarkers : this.$backMarkers;\n      delete markers[markerId];\n      this._signal(marker.inFront ? \"changeFrontMarker\" : \"changeBackMarker\");\n    };\n    EditSession.prototype.getMarkers = function (inFront) {\n      return inFront ? this.$frontMarkers : this.$backMarkers;\n    };\n    EditSession.prototype.highlight = function (re) {\n      if (!this.$searchHighlight) {\n        var highlight = new SearchHighlight(null, \"ace_selected-word\", \"text\");\n        this.$searchHighlight = this.addDynamicMarker(highlight);\n      }\n      this.$searchHighlight.setRegexp(re);\n    };\n    EditSession.prototype.highlightLines = function (\n      startRow,\n      endRow,\n      clazz,\n      inFront,\n    ) {\n      if (typeof endRow != \"number\") {\n        clazz = endRow;\n        endRow = startRow;\n      }\n      if (!clazz) clazz = \"ace_step\";\n      var range = new Range(startRow, 0, endRow, Infinity);\n      range.id = this.addMarker(range, clazz, \"fullLine\", inFront);\n      return range;\n    };\n    EditSession.prototype.setAnnotations = function (annotations) {\n      this.$annotations = annotations;\n      this._signal(\"changeAnnotation\", {});\n    };\n    EditSession.prototype.getAnnotations = function () {\n      return this.$annotations || [];\n    };\n    EditSession.prototype.clearAnnotations = function () {\n      this.setAnnotations([]);\n    };\n    EditSession.prototype.$detectNewLine = function (text) {\n      var match = text.match(/^.*?(\\r?\\n)/m);\n      if (match) {\n        this.$autoNewLine = match[1];\n      } else {\n        this.$autoNewLine = \"\\n\";\n      }\n    };\n    EditSession.prototype.getWordRange = function (row, column) {\n      var line = this.getLine(row);\n      var inToken = false;\n      if (column > 0) inToken = !!line.charAt(column - 1).match(this.tokenRe);\n      if (!inToken) inToken = !!line.charAt(column).match(this.tokenRe);\n      if (inToken) var re = this.tokenRe;\n      else if (/^\\s+$/.test(line.slice(column - 1, column + 1))) var re = /\\s/;\n      else var re = this.nonTokenRe;\n      var start = column;\n      if (start > 0) {\n        do {\n          start--;\n        } while (start >= 0 && line.charAt(start).match(re));\n        start++;\n      }\n      var end = column;\n      while (end < line.length && line.charAt(end).match(re)) {\n        end++;\n      }\n      return new Range(row, start, row, end);\n    };\n    EditSession.prototype.getAWordRange = function (row, column) {\n      var wordRange = this.getWordRange(row, column);\n      var line = this.getLine(wordRange.end.row);\n      while (line.charAt(wordRange.end.column).match(/[ \\t]/)) {\n        wordRange.end.column += 1;\n      }\n      return wordRange;\n    };\n    EditSession.prototype.setNewLineMode = function (newLineMode) {\n      this.doc.setNewLineMode(newLineMode);\n    };\n    EditSession.prototype.getNewLineMode = function () {\n      return this.doc.getNewLineMode();\n    };\n    EditSession.prototype.setUseWorker = function (useWorker) {\n      this.setOption(\"useWorker\", useWorker);\n    };\n    EditSession.prototype.getUseWorker = function () {\n      return this.$useWorker;\n    };\n    EditSession.prototype.onReloadTokenizer = function (e) {\n      var rows = e.data;\n      this.bgTokenizer.start(rows.first);\n      this._signal(\"tokenizerUpdate\", e);\n    };\n    EditSession.prototype.setMode = function (mode, cb) {\n      if (mode && typeof mode === \"object\") {\n        if (mode.getTokenizer) return this.$onChangeMode(mode);\n        var options = mode;\n        var path = options.path;\n      } else {\n        path = /**@type{string}*/ (mode) || \"ace/mode/text\";\n      }\n      if (!this.$modes[\"ace/mode/text\"])\n        this.$modes[\"ace/mode/text\"] = new TextMode();\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(\n        [\"mode\", path],\n        function (m) {\n          if (this.$modeId !== path) return cb && cb();\n          if (this.$modes[path] && !options) {\n            this.$onChangeMode(this.$modes[path]);\n          } else if (m && m.Mode) {\n            m = new m.Mode(options);\n            if (!options) {\n              this.$modes[path] = m;\n              m.$id = path;\n            }\n            this.$onChangeMode(m);\n          }\n          cb && cb();\n        }.bind(this),\n      );\n      if (!this.$mode) this.$onChangeMode(this.$modes[\"ace/mode/text\"], true);\n    };\n    EditSession.prototype.$onChangeMode = function (mode, $isPlaceholder) {\n      if (!$isPlaceholder) this.$modeId = mode.$id;\n      if (this.$mode === mode) return;\n      var oldMode = this.$mode;\n      this.$mode = mode;\n      this.$stopWorker();\n      if (this.$useWorker) this.$startWorker();\n      var tokenizer = mode.getTokenizer();\n      if (tokenizer.on !== undefined) {\n        var onReloadTokenizer = this.onReloadTokenizer.bind(this);\n        tokenizer.on(\"update\", onReloadTokenizer);\n      }\n      this.bgTokenizer.setTokenizer(tokenizer);\n      this.bgTokenizer.setDocument(this.getDocument());\n      this.tokenRe = mode.tokenRe;\n      this.nonTokenRe = mode.nonTokenRe;\n      if (!$isPlaceholder) {\n        if (mode.attachToSession) mode.attachToSession(this);\n        this.$options.wrapMethod.set.call(this, this.$wrapMethod);\n        this.$setFolding(mode.foldingRules);\n        this.bgTokenizer.start(0);\n        this._emit(\"changeMode\", { oldMode: oldMode, mode: mode });\n      }\n    };\n    EditSession.prototype.$stopWorker = function () {\n      if (this.$worker) {\n        this.$worker.terminate();\n        this.$worker = null;\n      }\n    };\n    EditSession.prototype.$startWorker = function () {\n      try {\n        this.$worker = this.$mode.createWorker(this);\n      } catch (e) {\n        config.warn(\"Could not load worker\", e);\n        this.$worker = null;\n      }\n    };\n    EditSession.prototype.getMode = function () {\n      return this.$mode;\n    };\n    EditSession.prototype.setScrollTop = function (scrollTop) {\n      if (this.$scrollTop === scrollTop || isNaN(scrollTop)) return;\n      this.$scrollTop = scrollTop;\n      this._signal(\"changeScrollTop\", scrollTop);\n    };\n    EditSession.prototype.getScrollTop = function () {\n      return this.$scrollTop;\n    };\n    EditSession.prototype.setScrollLeft = function (scrollLeft) {\n      if (this.$scrollLeft === scrollLeft || isNaN(scrollLeft)) return;\n      this.$scrollLeft = scrollLeft;\n      this._signal(\"changeScrollLeft\", scrollLeft);\n    };\n    EditSession.prototype.getScrollLeft = function () {\n      return this.$scrollLeft;\n    };\n    EditSession.prototype.getScreenWidth = function () {\n      this.$computeWidth();\n      if (this.lineWidgets)\n        return Math.max(this.getLineWidgetMaxWidth(), this.screenWidth);\n      return this.screenWidth;\n    };\n    EditSession.prototype.getLineWidgetMaxWidth = function () {\n      if (this.lineWidgetsWidth != null) return this.lineWidgetsWidth;\n      var width = 0;\n      this.lineWidgets.forEach(function (w) {\n        if (w && w.screenWidth > width) width = w.screenWidth;\n      });\n      return (this.lineWidgetWidth = width);\n    };\n    EditSession.prototype.$computeWidth = function (force) {\n      if (this.$modified || force) {\n        this.$modified = false;\n        if (this.$useWrapMode) return (this.screenWidth = this.$wrapLimit);\n        var lines = this.doc.getAllLines();\n        var cache = this.$rowLengthCache;\n        var longestScreenLine = 0;\n        var foldIndex = 0;\n        var foldLine = this.$foldData[foldIndex];\n        var foldStart = foldLine ? foldLine.start.row : Infinity;\n        var len = lines.length;\n        for (var i = 0; i < len; i++) {\n          if (i > foldStart) {\n            i = foldLine.end.row + 1;\n            if (i >= len) break;\n            foldLine = this.$foldData[foldIndex++];\n            foldStart = foldLine ? foldLine.start.row : Infinity;\n          }\n          if (cache[i] == null)\n            cache[i] = this.$getStringScreenWidth(lines[i])[0];\n          if (cache[i] > longestScreenLine) longestScreenLine = cache[i];\n        }\n        this.screenWidth = longestScreenLine;\n      }\n    };\n    EditSession.prototype.getLine = function (row) {\n      return this.doc.getLine(row);\n    };\n    EditSession.prototype.getLines = function (firstRow, lastRow) {\n      return this.doc.getLines(firstRow, lastRow);\n    };\n    EditSession.prototype.getLength = function () {\n      return this.doc.getLength();\n    };\n    EditSession.prototype.getTextRange = function (range) {\n      return this.doc.getTextRange(range || this.selection.getRange());\n    };\n    EditSession.prototype.insert = function (position, text) {\n      return this.doc.insert(position, text);\n    };\n    EditSession.prototype.remove = function (range) {\n      return this.doc.remove(range);\n    };\n    EditSession.prototype.removeFullLines = function (firstRow, lastRow) {\n      return this.doc.removeFullLines(firstRow, lastRow);\n    };\n    EditSession.prototype.undoChanges = function (deltas, dontSelect) {\n      if (!deltas.length) return;\n      this.$fromUndo = true;\n      for (var i = deltas.length - 1; i != -1; i--) {\n        var delta = deltas[i];\n        if (delta.action == \"insert\" || delta.action == \"remove\") {\n          this.doc.revertDelta(delta);\n        } else if (delta.folds) {\n          this.addFolds(delta.folds);\n        }\n      }\n      if (!dontSelect && this.$undoSelect) {\n        if (deltas.selectionBefore)\n          this.selection.fromJSON(deltas.selectionBefore);\n        else this.selection.setRange(this.$getUndoSelection(deltas, true));\n      }\n      this.$fromUndo = false;\n    };\n    EditSession.prototype.redoChanges = function (deltas, dontSelect) {\n      if (!deltas.length) return;\n      this.$fromUndo = true;\n      for (var i = 0; i < deltas.length; i++) {\n        var delta = deltas[i];\n        if (delta.action == \"insert\" || delta.action == \"remove\") {\n          this.doc.$safeApplyDelta(delta);\n        }\n      }\n      if (!dontSelect && this.$undoSelect) {\n        if (deltas.selectionAfter)\n          this.selection.fromJSON(deltas.selectionAfter);\n        else this.selection.setRange(this.$getUndoSelection(deltas, false));\n      }\n      this.$fromUndo = false;\n    };\n    EditSession.prototype.setUndoSelect = function (enable) {\n      this.$undoSelect = enable;\n    };\n    EditSession.prototype.$getUndoSelection = function (deltas, isUndo) {\n      function isInsert(delta) {\n        return isUndo ? delta.action !== \"insert\" : delta.action === \"insert\";\n      }\n      var range, point;\n      for (var i = 0; i < deltas.length; i++) {\n        var delta = deltas[i];\n        if (!delta.start) continue; // skip folds\n        if (!range) {\n          if (isInsert(delta)) {\n            range = Range.fromPoints(delta.start, delta.end);\n          } else {\n            range = Range.fromPoints(delta.start, delta.start);\n          }\n          continue;\n        }\n        if (isInsert(delta)) {\n          point = delta.start;\n          if (range.compare(point.row, point.column) == -1) {\n            range.setStart(point);\n          }\n          point = delta.end;\n          if (range.compare(point.row, point.column) == 1) {\n            range.setEnd(point);\n          }\n        } else {\n          point = delta.start;\n          if (range.compare(point.row, point.column) == -1) {\n            range = Range.fromPoints(delta.start, delta.start);\n          }\n        }\n      }\n      return range;\n    };\n    EditSession.prototype.replace = function (range, text) {\n      return this.doc.replace(range, text);\n    };\n    EditSession.prototype.moveText = function (fromRange, toPosition, copy) {\n      var text = this.getTextRange(fromRange);\n      var folds = this.getFoldsInRange(fromRange);\n      var toRange = Range.fromPoints(toPosition, toPosition);\n      if (!copy) {\n        this.remove(fromRange);\n        var rowDiff = fromRange.start.row - fromRange.end.row;\n        var collDiff = rowDiff\n          ? -fromRange.end.column\n          : fromRange.start.column - fromRange.end.column;\n        if (collDiff) {\n          if (\n            toRange.start.row == fromRange.end.row &&\n            toRange.start.column > fromRange.end.column\n          )\n            toRange.start.column += collDiff;\n          if (\n            toRange.end.row == fromRange.end.row &&\n            toRange.end.column > fromRange.end.column\n          )\n            toRange.end.column += collDiff;\n        }\n        if (rowDiff && toRange.start.row >= fromRange.end.row) {\n          toRange.start.row += rowDiff;\n          toRange.end.row += rowDiff;\n        }\n      }\n      toRange.end = this.insert(toRange.start, text);\n      if (folds.length) {\n        var oldStart = fromRange.start;\n        var newStart = toRange.start;\n        var rowDiff = newStart.row - oldStart.row;\n        var collDiff = newStart.column - oldStart.column;\n        this.addFolds(\n          folds.map(function (x) {\n            x = x.clone();\n            if (x.start.row == oldStart.row) x.start.column += collDiff;\n            if (x.end.row == oldStart.row) x.end.column += collDiff;\n            x.start.row += rowDiff;\n            x.end.row += rowDiff;\n            return x;\n          }),\n        );\n      }\n      return toRange;\n    };\n    EditSession.prototype.indentRows = function (\n      startRow,\n      endRow,\n      indentString,\n    ) {\n      indentString = indentString.replace(/\\t/g, this.getTabString());\n      for (var row = startRow; row <= endRow; row++)\n        this.doc.insertInLine({ row: row, column: 0 }, indentString);\n    };\n    EditSession.prototype.outdentRows = function (range) {\n      var rowRange = range.collapseRows();\n      var deleteRange = new Range(0, 0, 0, 0);\n      var size = this.getTabSize();\n      for (var i = rowRange.start.row; i <= rowRange.end.row; ++i) {\n        var line = this.getLine(i);\n        deleteRange.start.row = i;\n        deleteRange.end.row = i;\n        for (var j = 0; j < size; ++j) if (line.charAt(j) != \" \") break;\n        if (j < size && line.charAt(j) == \"\\t\") {\n          deleteRange.start.column = j;\n          deleteRange.end.column = j + 1;\n        } else {\n          deleteRange.start.column = 0;\n          deleteRange.end.column = j;\n        }\n        this.remove(deleteRange);\n      }\n    };\n    EditSession.prototype.$moveLines = function (firstRow, lastRow, dir) {\n      firstRow = this.getRowFoldStart(firstRow);\n      lastRow = this.getRowFoldEnd(lastRow);\n      if (dir < 0) {\n        var row = this.getRowFoldStart(firstRow + dir);\n        if (row < 0) return 0;\n        var diff = row - firstRow;\n      } else if (dir > 0) {\n        var row = this.getRowFoldEnd(lastRow + dir);\n        if (row > this.doc.getLength() - 1) return 0;\n        var diff = row - lastRow;\n      } else {\n        firstRow = this.$clipRowToDocument(firstRow);\n        lastRow = this.$clipRowToDocument(lastRow);\n        var diff = lastRow - firstRow + 1;\n      }\n      var range = new Range(firstRow, 0, lastRow, Number.MAX_VALUE);\n      var folds = this.getFoldsInRange(range).map(function (x) {\n        x = x.clone();\n        x.start.row += diff;\n        x.end.row += diff;\n        return x;\n      });\n      var lines =\n        dir == 0\n          ? this.doc.getLines(firstRow, lastRow)\n          : this.doc.removeFullLines(firstRow, lastRow);\n      this.doc.insertFullLines(firstRow + diff, lines);\n      folds.length && this.addFolds(folds);\n      return diff;\n    };\n    EditSession.prototype.moveLinesUp = function (firstRow, lastRow) {\n      return this.$moveLines(firstRow, lastRow, -1);\n    };\n    EditSession.prototype.moveLinesDown = function (firstRow, lastRow) {\n      return this.$moveLines(firstRow, lastRow, 1);\n    };\n    EditSession.prototype.duplicateLines = function (firstRow, lastRow) {\n      return this.$moveLines(firstRow, lastRow, 0);\n    };\n    EditSession.prototype.$clipRowToDocument = function (row) {\n      return Math.max(0, Math.min(row, this.doc.getLength() - 1));\n    };\n    EditSession.prototype.$clipColumnToRow = function (row, column) {\n      if (column < 0) return 0;\n      return Math.min(this.doc.getLine(row).length, column);\n    };\n    EditSession.prototype.$clipPositionToDocument = function (row, column) {\n      column = Math.max(0, column);\n      if (row < 0) {\n        row = 0;\n        column = 0;\n      } else {\n        var len = this.doc.getLength();\n        if (row >= len) {\n          row = len - 1;\n          column = this.doc.getLine(len - 1).length;\n        } else {\n          column = Math.min(this.doc.getLine(row).length, column);\n        }\n      }\n      return {\n        row: row,\n        column: column,\n      };\n    };\n    EditSession.prototype.$clipRangeToDocument = function (range) {\n      if (range.start.row < 0) {\n        range.start.row = 0;\n        range.start.column = 0;\n      } else {\n        range.start.column = this.$clipColumnToRow(\n          range.start.row,\n          range.start.column,\n        );\n      }\n      var len = this.doc.getLength() - 1;\n      if (range.end.row > len) {\n        range.end.row = len;\n        range.end.column = this.doc.getLine(len).length;\n      } else {\n        range.end.column = this.$clipColumnToRow(\n          range.end.row,\n          range.end.column,\n        );\n      }\n      return range;\n    };\n    EditSession.prototype.setUseWrapMode = function (useWrapMode) {\n      if (useWrapMode != this.$useWrapMode) {\n        this.$useWrapMode = useWrapMode;\n        this.$modified = true;\n        this.$resetRowCache(0);\n        if (useWrapMode) {\n          var len = this.getLength();\n          this.$wrapData = Array(len);\n          this.$updateWrapData(0, len - 1);\n        }\n        this._signal(\"changeWrapMode\");\n      }\n    };\n    EditSession.prototype.getUseWrapMode = function () {\n      return this.$useWrapMode;\n    };\n    EditSession.prototype.setWrapLimitRange = function (min, max) {\n      if (\n        this.$wrapLimitRange.min !== min ||\n        this.$wrapLimitRange.max !== max\n      ) {\n        this.$wrapLimitRange = { min: min, max: max };\n        this.$modified = true;\n        this.$bidiHandler.markAsDirty();\n        if (this.$useWrapMode) this._signal(\"changeWrapMode\");\n      }\n    };\n    EditSession.prototype.adjustWrapLimit = function (\n      desiredLimit,\n      $printMargin,\n    ) {\n      var limits = this.$wrapLimitRange;\n      if (limits.max < 0) limits = { min: $printMargin, max: $printMargin };\n      var wrapLimit = this.$constrainWrapLimit(\n        desiredLimit,\n        limits.min,\n        limits.max,\n      );\n      if (wrapLimit != this.$wrapLimit && wrapLimit > 1) {\n        this.$wrapLimit = wrapLimit;\n        this.$modified = true;\n        if (this.$useWrapMode) {\n          this.$updateWrapData(0, this.getLength() - 1);\n          this.$resetRowCache(0);\n          this._signal(\"changeWrapLimit\");\n        }\n        return true;\n      }\n      return false;\n    };\n    EditSession.prototype.$constrainWrapLimit = function (wrapLimit, min, max) {\n      if (min) wrapLimit = Math.max(min, wrapLimit);\n      if (max) wrapLimit = Math.min(max, wrapLimit);\n      return wrapLimit;\n    };\n    EditSession.prototype.getWrapLimit = function () {\n      return this.$wrapLimit;\n    };\n    EditSession.prototype.setWrapLimit = function (limit) {\n      this.setWrapLimitRange(limit, limit);\n    };\n    EditSession.prototype.getWrapLimitRange = function () {\n      return {\n        min: this.$wrapLimitRange.min,\n        max: this.$wrapLimitRange.max,\n      };\n    };\n    EditSession.prototype.$updateInternalDataOnChange = function (delta) {\n      var useWrapMode = this.$useWrapMode;\n      var action = delta.action;\n      var start = delta.start;\n      var end = delta.end;\n      var firstRow = start.row;\n      var lastRow = end.row;\n      var len = lastRow - firstRow;\n      var removedFolds = null;\n      this.$updating = true;\n      if (len != 0) {\n        if (action === \"remove\") {\n          this[useWrapMode ? \"$wrapData\" : \"$rowLengthCache\"].splice(\n            firstRow,\n            len,\n          );\n          var foldLines = this.$foldData;\n          removedFolds = this.getFoldsInRange(delta);\n          this.removeFolds(removedFolds);\n          var foldLine = this.getFoldLine(end.row);\n          var idx = 0;\n          if (foldLine) {\n            foldLine.addRemoveChars(\n              end.row,\n              end.column,\n              start.column - end.column,\n            );\n            foldLine.shiftRow(-len);\n            var foldLineBefore = this.getFoldLine(firstRow);\n            if (foldLineBefore && foldLineBefore !== foldLine) {\n              foldLineBefore.merge(foldLine);\n              foldLine = foldLineBefore;\n            }\n            idx = foldLines.indexOf(foldLine) + 1;\n          }\n          for (idx; idx < foldLines.length; idx++) {\n            var foldLine = foldLines[idx];\n            if (foldLine.start.row >= end.row) {\n              foldLine.shiftRow(-len);\n            }\n          }\n          lastRow = firstRow;\n        } else {\n          var args = Array(len);\n          args.unshift(firstRow, 0);\n          var arr = useWrapMode ? this.$wrapData : this.$rowLengthCache;\n          arr.splice.apply(arr, args);\n          var foldLines = this.$foldData;\n          var foldLine = this.getFoldLine(firstRow);\n          var idx = 0;\n          if (foldLine) {\n            var cmp = foldLine.range.compareInside(start.row, start.column);\n            if (cmp == 0) {\n              foldLine = foldLine.split(start.row, start.column);\n              if (foldLine) {\n                foldLine.shiftRow(len);\n                foldLine.addRemoveChars(lastRow, 0, end.column - start.column);\n              }\n            } else if (cmp == -1) {\n              foldLine.addRemoveChars(firstRow, 0, end.column - start.column);\n              foldLine.shiftRow(len);\n            }\n            idx = foldLines.indexOf(foldLine) + 1;\n          }\n          for (idx; idx < foldLines.length; idx++) {\n            var foldLine = foldLines[idx];\n            if (foldLine.start.row >= firstRow) {\n              foldLine.shiftRow(len);\n            }\n          }\n        }\n      } else {\n        len = Math.abs(delta.start.column - delta.end.column);\n        if (action === \"remove\") {\n          removedFolds = this.getFoldsInRange(delta);\n          this.removeFolds(removedFolds);\n          len = -len;\n        }\n        var foldLine = this.getFoldLine(firstRow);\n        if (foldLine) {\n          foldLine.addRemoveChars(firstRow, start.column, len);\n        }\n      }\n      if (useWrapMode && this.$wrapData.length != this.doc.getLength()) {\n        console.error(\n          \"doc.getLength() and $wrapData.length have to be the same!\",\n        );\n      }\n      this.$updating = false;\n      if (useWrapMode) this.$updateWrapData(firstRow, lastRow);\n      else this.$updateRowLengthCache(firstRow, lastRow);\n      return removedFolds;\n    };\n    EditSession.prototype.$updateRowLengthCache = function (firstRow, lastRow) {\n      this.$rowLengthCache[firstRow] = null;\n      this.$rowLengthCache[lastRow] = null;\n    };\n    EditSession.prototype.$updateWrapData = function (firstRow, lastRow) {\n      var lines = this.doc.getAllLines();\n      var tabSize = this.getTabSize();\n      var wrapData = this.$wrapData;\n      var wrapLimit = this.$wrapLimit;\n      var tokens;\n      var foldLine;\n      var row = firstRow;\n      lastRow = Math.min(lastRow, lines.length - 1);\n      while (row <= lastRow) {\n        foldLine = this.getFoldLine(row, foldLine);\n        if (!foldLine) {\n          tokens = this.$getDisplayTokens(lines[row]);\n          wrapData[row] = this.$computeWrapSplits(tokens, wrapLimit, tabSize);\n          row++;\n        } else {\n          tokens = [];\n          foldLine.walk(\n            function (placeholder, row, column, lastColumn) {\n              var walkTokens;\n              if (placeholder != null) {\n                walkTokens = this.$getDisplayTokens(placeholder, tokens.length);\n                walkTokens[0] = PLACEHOLDER_START;\n                for (var i = 1; i < walkTokens.length; i++) {\n                  walkTokens[i] = PLACEHOLDER_BODY;\n                }\n              } else {\n                walkTokens = this.$getDisplayTokens(\n                  lines[row].substring(lastColumn, column),\n                  tokens.length,\n                );\n              }\n              tokens = tokens.concat(walkTokens);\n            }.bind(this),\n            foldLine.end.row,\n            lines[foldLine.end.row].length + 1,\n          );\n          wrapData[foldLine.start.row] = this.$computeWrapSplits(\n            tokens,\n            wrapLimit,\n            tabSize,\n          );\n          row = foldLine.end.row + 1;\n        }\n      }\n    };\n    EditSession.prototype.$computeWrapSplits = function (\n      tokens,\n      wrapLimit,\n      tabSize,\n    ) {\n      if (tokens.length == 0) {\n        return [];\n      }\n      var splits = [];\n      var displayLength = tokens.length;\n      var lastSplit = 0,\n        lastDocSplit = 0;\n      var isCode = this.$wrapAsCode;\n      var indentedSoftWrap = this.$indentedSoftWrap;\n      var maxIndent =\n        wrapLimit <= Math.max(2 * tabSize, 8) || indentedSoftWrap === false\n          ? 0\n          : Math.floor(wrapLimit / 2);\n      function getWrapIndent() {\n        var indentation = 0;\n        if (maxIndent === 0) return indentation;\n        if (indentedSoftWrap) {\n          for (var i = 0; i < tokens.length; i++) {\n            var token = tokens[i];\n            if (token == SPACE) indentation += 1;\n            else if (token == TAB) indentation += tabSize;\n            else if (token == TAB_SPACE) continue;\n            else break;\n          }\n        }\n        if (isCode && indentedSoftWrap !== false) indentation += tabSize;\n        return Math.min(indentation, maxIndent);\n      }\n      function addSplit(screenPos) {\n        var len = screenPos - lastSplit;\n        for (var i = lastSplit; i < screenPos; i++) {\n          var ch = tokens[i];\n          if (ch === 12 || ch === 2) len -= 1;\n        }\n        if (!splits.length) {\n          indent = getWrapIndent();\n          splits.indent = indent;\n        }\n        lastDocSplit += len;\n        splits.push(lastDocSplit);\n        lastSplit = screenPos;\n      }\n      var indent = 0;\n      while (displayLength - lastSplit > wrapLimit - indent) {\n        var split = lastSplit + wrapLimit - indent;\n        if (tokens[split - 1] >= SPACE && tokens[split] >= SPACE) {\n          addSplit(split);\n          continue;\n        }\n        if (\n          tokens[split] == PLACEHOLDER_START ||\n          tokens[split] == PLACEHOLDER_BODY\n        ) {\n          for (split; split != lastSplit - 1; split--) {\n            if (tokens[split] == PLACEHOLDER_START) {\n              break;\n            }\n          }\n          if (split > lastSplit) {\n            addSplit(split);\n            continue;\n          }\n          split = lastSplit + wrapLimit;\n          for (split; split < tokens.length; split++) {\n            if (tokens[split] != PLACEHOLDER_BODY) {\n              break;\n            }\n          }\n          if (split == tokens.length) {\n            break; // Breaks the while-loop.\n          }\n          addSplit(split);\n          continue;\n        }\n        var minSplit = Math.max(\n          split - (wrapLimit - (wrapLimit >> 2)),\n          lastSplit - 1,\n        );\n        while (split > minSplit && tokens[split] < PLACEHOLDER_START) {\n          split--;\n        }\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          continue;\n        }\n        split = lastSplit + wrapLimit;\n        if (tokens[split] == CHAR_EXT) split--;\n        addSplit(split - indent);\n      }\n      return splits;\n    };\n    EditSession.prototype.$getDisplayTokens = function (str, offset) {\n      var arr = [];\n      var tabSize;\n      offset = offset || 0;\n      for (var i = 0; i < str.length; i++) {\n        var c = str.charCodeAt(i);\n        if (c == 9) {\n          tabSize = this.getScreenTabSize(arr.length + offset);\n          arr.push(TAB);\n          for (var n = 1; n < tabSize; n++) {\n            arr.push(TAB_SPACE);\n          }\n        } else if (c == 32) {\n          arr.push(SPACE);\n        } else if ((c > 39 && c < 48) || (c > 57 && c < 64)) {\n          arr.push(PUNCTUATION);\n        } else if (c >= 0x1100 && isFullWidth(c)) {\n          arr.push(CHAR, CHAR_EXT);\n        } else {\n          arr.push(CHAR);\n        }\n      }\n      return arr;\n    };\n    EditSession.prototype.$getStringScreenWidth = function (\n      str,\n      maxScreenColumn,\n      screenColumn,\n    ) {\n      if (maxScreenColumn == 0) return [0, 0];\n      if (maxScreenColumn == null) maxScreenColumn = Infinity;\n      screenColumn = screenColumn || 0;\n      var c, column;\n      for (column = 0; column < str.length; column++) {\n        c = str.charCodeAt(column);\n        if (c == 9) {\n          screenColumn += this.getScreenTabSize(screenColumn);\n        } else if (c >= 0x1100 && isFullWidth(c)) {\n          screenColumn += 2;\n        } else {\n          screenColumn += 1;\n        }\n        if (screenColumn > maxScreenColumn) {\n          break;\n        }\n      }\n      return [screenColumn, column];\n    };\n    EditSession.prototype.getRowLength = function (row) {\n      var h = 1;\n      if (this.lineWidgets)\n        h += (this.lineWidgets[row] && this.lineWidgets[row].rowCount) || 0;\n      if (!this.$useWrapMode || !this.$wrapData[row]) return h;\n      else return this.$wrapData[row].length + h;\n    };\n    EditSession.prototype.getRowLineCount = function (row) {\n      if (!this.$useWrapMode || !this.$wrapData[row]) {\n        return 1;\n      } else {\n        return this.$wrapData[row].length + 1;\n      }\n    };\n    EditSession.prototype.getRowWrapIndent = function (screenRow) {\n      if (this.$useWrapMode) {\n        var pos = this.screenToDocumentPosition(screenRow, Number.MAX_VALUE);\n        var splits = this.$wrapData[pos.row];\n        return splits.length && splits[0] < pos.column ? splits.indent : 0;\n      } else {\n        return 0;\n      }\n    };\n    EditSession.prototype.getScreenLastRowColumn = function (screenRow) {\n      var pos = this.screenToDocumentPosition(screenRow, Number.MAX_VALUE);\n      return this.documentToScreenColumn(pos.row, pos.column);\n    };\n    EditSession.prototype.getDocumentLastRowColumn = function (\n      docRow,\n      docColumn,\n    ) {\n      var screenRow = this.documentToScreenRow(docRow, docColumn);\n      return this.getScreenLastRowColumn(screenRow);\n    };\n    EditSession.prototype.getDocumentLastRowColumnPosition = function (\n      docRow,\n      docColumn,\n    ) {\n      var screenRow = this.documentToScreenRow(docRow, docColumn);\n      return this.screenToDocumentPosition(screenRow, Number.MAX_VALUE / 10);\n    };\n    EditSession.prototype.getRowSplitData = function (row) {\n      if (!this.$useWrapMode) {\n        return undefined;\n      } else {\n        return this.$wrapData[row];\n      }\n    };\n    EditSession.prototype.getScreenTabSize = function (screenColumn) {\n      return this.$tabSize - (screenColumn % this.$tabSize | 0);\n    };\n    EditSession.prototype.screenToDocumentRow = function (\n      screenRow,\n      screenColumn,\n    ) {\n      return this.screenToDocumentPosition(screenRow, screenColumn).row;\n    };\n    EditSession.prototype.screenToDocumentColumn = function (\n      screenRow,\n      screenColumn,\n    ) {\n      return this.screenToDocumentPosition(screenRow, screenColumn).column;\n    };\n    EditSession.prototype.screenToDocumentPosition = function (\n      screenRow,\n      screenColumn,\n      offsetX,\n    ) {\n      if (screenRow < 0) return { row: 0, column: 0 };\n      var line;\n      var docRow = 0;\n      var docColumn = 0;\n      var column;\n      var row = 0;\n      var rowLength = 0;\n      var rowCache = this.$screenRowCache;\n      var i = this.$getRowCacheIndex(rowCache, screenRow);\n      var l = rowCache.length;\n      if (l && i >= 0) {\n        var row = rowCache[i];\n        var docRow = this.$docRowCache[i];\n        var doCache = screenRow > rowCache[l - 1];\n      } else {\n        var doCache = !l;\n      }\n      var maxRow = this.getLength() - 1;\n      var foldLine = this.getNextFoldLine(docRow);\n      var foldStart = foldLine ? foldLine.start.row : Infinity;\n      while (row <= screenRow) {\n        rowLength = this.getRowLength(docRow);\n        if (row + rowLength > screenRow || docRow >= maxRow) {\n          break;\n        } else {\n          row += rowLength;\n          docRow++;\n          if (docRow > foldStart) {\n            docRow = foldLine.end.row + 1;\n            foldLine = this.getNextFoldLine(docRow, foldLine);\n            foldStart = foldLine ? foldLine.start.row : Infinity;\n          }\n        }\n        if (doCache) {\n          this.$docRowCache.push(docRow);\n          this.$screenRowCache.push(row);\n        }\n      }\n      if (foldLine && foldLine.start.row <= docRow) {\n        line = this.getFoldDisplayLine(foldLine);\n        docRow = foldLine.start.row;\n      } else if (row + rowLength <= screenRow || docRow > maxRow) {\n        return {\n          row: maxRow,\n          column: this.getLine(maxRow).length,\n        };\n      } else {\n        line = this.getLine(docRow);\n        foldLine = null;\n      }\n      var wrapIndent = 0,\n        splitIndex = Math.floor(screenRow - row);\n      if (this.$useWrapMode) {\n        var splits = this.$wrapData[docRow];\n        if (splits) {\n          column = splits[splitIndex];\n          if (splitIndex > 0 && splits.length) {\n            wrapIndent = splits.indent;\n            docColumn = splits[splitIndex - 1] || splits[splits.length - 1];\n            line = line.substring(docColumn);\n          }\n        }\n      }\n      if (\n        offsetX !== undefined &&\n        this.$bidiHandler.isBidiRow(row + splitIndex, docRow, splitIndex)\n      )\n        screenColumn = this.$bidiHandler.offsetToCol(offsetX);\n      docColumn += this.$getStringScreenWidth(\n        line,\n        screenColumn - wrapIndent,\n      )[1];\n      if (this.$useWrapMode && docColumn >= column) docColumn = column - 1;\n      if (foldLine) return foldLine.idxToPosition(docColumn);\n      return { row: docRow, column: docColumn };\n    };\n    EditSession.prototype.documentToScreenPosition = function (\n      docRow,\n      docColumn,\n    ) {\n      if (typeof docColumn === \"undefined\")\n        var pos = this.$clipPositionToDocument(\n          /**@type{Point}*/ (docRow).row,\n          /**@type{Point}*/ (docRow).column,\n        );\n      else\n        pos = this.$clipPositionToDocument(\n          /**@type{number}*/ (docRow),\n          docColumn,\n        );\n      docRow = pos.row;\n      docColumn = pos.column;\n      var screenRow = 0;\n      var foldStartRow = null;\n      var fold = null;\n      fold = this.getFoldAt(docRow, docColumn, 1);\n      if (fold) {\n        docRow = fold.start.row;\n        docColumn = fold.start.column;\n      }\n      var rowEnd,\n        row = 0;\n      var rowCache = this.$docRowCache;\n      var i = this.$getRowCacheIndex(rowCache, docRow);\n      var l = rowCache.length;\n      if (l && i >= 0) {\n        var row = rowCache[i];\n        var screenRow = this.$screenRowCache[i];\n        var doCache = docRow > rowCache[l - 1];\n      } else {\n        var doCache = !l;\n      }\n      var foldLine = this.getNextFoldLine(row);\n      var foldStart = foldLine ? foldLine.start.row : Infinity;\n      while (row < docRow) {\n        if (row >= foldStart) {\n          rowEnd = foldLine.end.row + 1;\n          if (rowEnd > docRow) break;\n          foldLine = this.getNextFoldLine(rowEnd, foldLine);\n          foldStart = foldLine ? foldLine.start.row : Infinity;\n        } else {\n          rowEnd = row + 1;\n        }\n        screenRow += this.getRowLength(row);\n        row = rowEnd;\n        if (doCache) {\n          this.$docRowCache.push(row);\n          this.$screenRowCache.push(screenRow);\n        }\n      }\n      var textLine = \"\";\n      if (foldLine && row >= foldStart) {\n        textLine = this.getFoldDisplayLine(foldLine, docRow, docColumn);\n        foldStartRow = foldLine.start.row;\n      } else {\n        textLine = this.getLine(docRow).substring(0, docColumn);\n        foldStartRow = docRow;\n      }\n      var wrapIndent = 0;\n      if (this.$useWrapMode) {\n        var wrapRow = this.$wrapData[foldStartRow];\n        if (wrapRow) {\n          var screenRowOffset = 0;\n          while (textLine.length >= wrapRow[screenRowOffset]) {\n            screenRow++;\n            screenRowOffset++;\n          }\n          textLine = textLine.substring(\n            wrapRow[screenRowOffset - 1] || 0,\n            textLine.length,\n          );\n          wrapIndent = screenRowOffset > 0 ? wrapRow.indent : 0;\n        }\n      }\n      if (\n        this.lineWidgets &&\n        this.lineWidgets[row] &&\n        this.lineWidgets[row].rowsAbove\n      )\n        screenRow += this.lineWidgets[row].rowsAbove;\n      return {\n        row: screenRow,\n        column: wrapIndent + this.$getStringScreenWidth(textLine)[0],\n      };\n    };\n    EditSession.prototype.documentToScreenColumn = function (row, docColumn) {\n      return this.documentToScreenPosition(row, docColumn).column;\n    };\n    EditSession.prototype.documentToScreenRow = function (docRow, docColumn) {\n      return this.documentToScreenPosition(docRow, docColumn).row;\n    };\n    EditSession.prototype.getScreenLength = function () {\n      var screenRows = 0;\n      var fold = null;\n      if (!this.$useWrapMode) {\n        screenRows = this.getLength();\n        var foldData = this.$foldData;\n        for (var i = 0; i < foldData.length; i++) {\n          fold = foldData[i];\n          screenRows -= fold.end.row - fold.start.row;\n        }\n      } else {\n        var lastRow = this.$wrapData.length;\n        var row = 0,\n          i = 0;\n        var fold = this.$foldData[i++];\n        var foldStart = fold ? fold.start.row : Infinity;\n        while (row < lastRow) {\n          var splits = this.$wrapData[row];\n          screenRows += splits ? splits.length + 1 : 1;\n          row++;\n          if (row > foldStart) {\n            row = fold.end.row + 1;\n            fold = this.$foldData[i++];\n            foldStart = fold ? fold.start.row : Infinity;\n          }\n        }\n      }\n      if (this.lineWidgets) screenRows += this.$getWidgetScreenLength();\n      return screenRows;\n    };\n    EditSession.prototype.$setFontMetrics = function (fm) {\n      if (!this.$enableVarChar) return;\n      this.$getStringScreenWidth = function (\n        str,\n        maxScreenColumn,\n        screenColumn,\n      ) {\n        if (maxScreenColumn === 0) return [0, 0];\n        if (!maxScreenColumn) maxScreenColumn = Infinity;\n        screenColumn = screenColumn || 0;\n        var c, column;\n        for (column = 0; column < str.length; column++) {\n          c = str.charAt(column);\n          if (c === \"\\t\") {\n            screenColumn += this.getScreenTabSize(screenColumn);\n          } else {\n            screenColumn += fm.getCharacterWidth(c);\n          }\n          if (screenColumn > maxScreenColumn) {\n            break;\n          }\n        }\n        return [screenColumn, column];\n      };\n    };\n    EditSession.prototype.destroy = function () {\n      if (!this.destroyed) {\n        this.bgTokenizer.setDocument(null);\n        this.bgTokenizer.cleanup();\n        this.destroyed = true;\n      }\n      this.$stopWorker();\n      this.removeAllListeners();\n      if (this.doc) {\n        this.doc.off(\"change\", this.$onChange);\n      }\n      this.selection.detach();\n    };\n    return EditSession;\n  })();\n  EditSession.$uid = 0;\n  EditSession.prototype.$modes = config.$modes;\n  EditSession.prototype.getValue = EditSession.prototype.toString;\n  EditSession.prototype.$defaultUndoManager = {\n    undo: function () {},\n    redo: function () {},\n    hasUndo: function () {},\n    hasRedo: function () {},\n    reset: function () {},\n    add: function () {},\n    addSelection: function () {},\n    startNewGroup: function () {},\n    addSession: function () {},\n  };\n  EditSession.prototype.$overwrite = false;\n  EditSession.prototype.$mode = null;\n  EditSession.prototype.$modeId = null;\n  EditSession.prototype.$scrollTop = 0;\n  EditSession.prototype.$scrollLeft = 0;\n  EditSession.prototype.$wrapLimit = 80;\n  EditSession.prototype.$useWrapMode = false;\n  EditSession.prototype.$wrapLimitRange = {\n    min: null,\n    max: null,\n  };\n  EditSession.prototype.lineWidgets = null;\n  EditSession.prototype.isFullWidth = isFullWidth;\n  oop.implement(EditSession.prototype, EventEmitter);\n  var CHAR = 1,\n    CHAR_EXT = 2,\n    PLACEHOLDER_START = 3,\n    PLACEHOLDER_BODY = 4,\n    PUNCTUATION = 9,\n    SPACE = 10,\n    TAB = 11,\n    TAB_SPACE = 12;\n  function isFullWidth(c) {\n    if (c < 0x1100) return false;\n    return (\n      (c >= 0x1100 && c <= 0x115f) ||\n      (c >= 0x11a3 && c <= 0x11a7) ||\n      (c >= 0x11fa && c <= 0x11ff) ||\n      (c >= 0x2329 && c <= 0x232a) ||\n      (c >= 0x2e80 && c <= 0x2e99) ||\n      (c >= 0x2e9b && c <= 0x2ef3) ||\n      (c >= 0x2f00 && c <= 0x2fd5) ||\n      (c >= 0x2ff0 && c <= 0x2ffb) ||\n      (c >= 0x3000 && c <= 0x303e) ||\n      (c >= 0x3041 && c <= 0x3096) ||\n      (c >= 0x3099 && c <= 0x30ff) ||\n      (c >= 0x3105 && c <= 0x312d) ||\n      (c >= 0x3131 && c <= 0x318e) ||\n      (c >= 0x3190 && c <= 0x31ba) ||\n      (c >= 0x31c0 && c <= 0x31e3) ||\n      (c >= 0x31f0 && c <= 0x321e) ||\n      (c >= 0x3220 && c <= 0x3247) ||\n      (c >= 0x3250 && c <= 0x32fe) ||\n      (c >= 0x3300 && c <= 0x4dbf) ||\n      (c >= 0x4e00 && c <= 0xa48c) ||\n      (c >= 0xa490 && c <= 0xa4c6) ||\n      (c >= 0xa960 && c <= 0xa97c) ||\n      (c >= 0xac00 && c <= 0xd7a3) ||\n      (c >= 0xd7b0 && c <= 0xd7c6) ||\n      (c >= 0xd7cb && c <= 0xd7fb) ||\n      (c >= 0xf900 && c <= 0xfaff) ||\n      (c >= 0xfe10 && c <= 0xfe19) ||\n      (c >= 0xfe30 && c <= 0xfe52) ||\n      (c >= 0xfe54 && c <= 0xfe66) ||\n      (c >= 0xfe68 && c <= 0xfe6b) ||\n      (c >= 0xff01 && c <= 0xff60) ||\n      (c >= 0xffe0 && c <= 0xffe6)\n    );\n  }\n  require(\"./edit_session/folding\").Folding.call(EditSession.prototype);\n  require(\"./edit_session/bracket_match\").BracketMatch.call(\n    EditSession.prototype,\n  );\n  config.defineOptions(EditSession.prototype, \"session\", {\n    wrap: {\n      set: function (value) {\n        if (!value || value == \"off\") value = false;\n        else if (value == \"free\") value = true;\n        else if (value == \"printMargin\") value = -1;\n        else if (typeof value == \"string\") value = parseInt(value, 10) || false;\n        if (this.$wrap == value) return;\n        this.$wrap = value;\n        if (!value) {\n          this.setUseWrapMode(false);\n        } else {\n          var col = typeof value == \"number\" ? value : null;\n          this.setWrapLimitRange(col, col);\n          this.setUseWrapMode(true);\n        }\n      },\n      get: function () {\n        if (this.getUseWrapMode()) {\n          if (this.$wrap == -1) return \"printMargin\";\n          if (!this.getWrapLimitRange().min) return \"free\";\n          return this.$wrap;\n        }\n        return \"off\";\n      },\n      handlesSet: true,\n    },\n    wrapMethod: {\n      set: function (val) {\n        val = val == \"auto\" ? this.$mode.type != \"text\" : val != \"text\";\n        if (val != this.$wrapAsCode) {\n          this.$wrapAsCode = val;\n          if (this.$useWrapMode) {\n            this.$useWrapMode = false;\n            this.setUseWrapMode(true);\n          }\n        }\n      },\n      initialValue: \"auto\",\n    },\n    indentedSoftWrap: {\n      set: function () {\n        if (this.$useWrapMode) {\n          this.$useWrapMode = false;\n          this.setUseWrapMode(true);\n        }\n      },\n      initialValue: true,\n    },\n    firstLineNumber: {\n      set: function () {\n        this._signal(\"changeBreakpoint\");\n      },\n      initialValue: 1,\n    },\n    useWorker: {\n      set: function (useWorker) {\n        this.$useWorker = useWorker;\n        this.$stopWorker();\n        if (useWorker) this.$startWorker();\n      },\n      initialValue: true,\n    },\n    useSoftTabs: { initialValue: true },\n    tabSize: {\n      set: function (tabSize) {\n        tabSize = parseInt(tabSize);\n        if (tabSize > 0 && this.$tabSize !== tabSize) {\n          this.$modified = true;\n          this.$rowLengthCache = [];\n          this.$tabSize = tabSize;\n          this._signal(\"changeTabSize\");\n        }\n      },\n      initialValue: 4,\n      handlesSet: true,\n    },\n    navigateWithinSoftTabs: { initialValue: false },\n    foldStyle: {\n      set: function (val) {\n        this.setFoldStyle(val);\n      },\n      handlesSet: true,\n    },\n    overwrite: {\n      set: function (val) {\n        this._signal(\"changeOverwrite\");\n      },\n      initialValue: false,\n    },\n    newLineMode: {\n      set: function (val) {\n        this.doc.setNewLineMode(val);\n      },\n      get: function () {\n        return this.doc.getNewLineMode();\n      },\n      handlesSet: true,\n    },\n    mode: {\n      set: function (val) {\n        this.setMode(val);\n      },\n      get: function () {\n        return this.$modeId;\n      },\n      handlesSet: true,\n    },\n  });\n  exports.EditSession = EditSession;\n});\n\ndefine(\"ace/search\", [\n  \"require\",\n  \"exports\",\n  \"module\",\n  \"ace/lib/lang\",\n  \"ace/lib/oop\",\n  \"ace/range\",\n], function (require, exports, module) {\n  \"use strict\";\n  var lang = require(\"./lib/lang\");\n  var oop = require(\"./lib/oop\");\n  var Range = require(\"./range\").Range;\n  var Search = /** @class */ (function () {\n    function Search() {\n      this.$options = {};\n    }\n    Search.prototype.set = function (options) {\n      oop.mixin(this.$options, options);\n      return this;\n    };\n    Search.prototype.getOptions = function () {\n      return lang.copyObject(this.$options);\n    };\n    Search.prototype.setOptions = function (options) {\n      this.$options = options;\n    };\n    Search.prototype.find = function (session) {\n      var options = this.$options;\n      var iterator = this.$matchIterator(session, options);\n      if (!iterator) return false;\n      var firstRange = null;\n      iterator.forEach(function (sr, sc, er, ec) {\n        firstRange = new Range(sr, sc, er, ec);\n        if (\n          sc == ec &&\n          options.start &&\n          /**@type{Range}*/ (options.start).start &&\n          options.skipCurrent != false &&\n          firstRange.isEqual(/**@type{Range}*/ (options.start))\n        ) {\n          firstRange = null;\n          return false;\n        }\n        return true;\n      });\n      return firstRange;\n    };\n    Search.prototype.findAll = function (session) {\n      var options = this.$options;\n      if (!options.needle) return [];\n      this.$assembleRegExp(options);\n      var range = options.range;\n      var lines = range\n        ? session.getLines(range.start.row, range.end.row)\n        : session.doc.getAllLines();\n      var ranges = [];\n      var re = options.re;\n      if (options.$isMultiLine) {\n        var len = re.length;\n        var maxRow = lines.length - len;\n        var prevRange;\n        outer: for (var row = re.offset || 0; row <= maxRow; row++) {\n          for (var j = 0; j < len; j++)\n            if (lines[row + j].search(re[j]) == -1) continue outer;\n          var startLine = lines[row];\n          var line = lines[row + len - 1];\n          var startIndex = startLine.length - startLine.match(re[0])[0].length;\n          var endIndex = line.match(re[len - 1])[0].length;\n          if (\n            prevRange &&\n            prevRange.end.row === row &&\n            prevRange.end.column > startIndex\n          ) {\n            continue;\n          }\n          ranges.push(\n            (prevRange = new Range(row, startIndex, row + len - 1, endIndex)),\n          );\n          if (len > 2) row = row + len - 2;\n        }\n      } else {\n        for (var i = 0; i < lines.length; i++) {\n          var matches = lang.getMatchOffsets(lines[i], re);\n          for (var j = 0; j < matches.length; j++) {\n            var match = matches[j];\n            ranges.push(\n              new Range(i, match.offset, i, match.offset + match.length),\n            );\n          }\n        }\n      }\n      if (range) {\n        var startColumn = range.start.column;\n        var endColumn = range.end.column;\n        var i = 0,\n          j = ranges.length - 1;\n        while (\n          i < j &&\n          ranges[i].start.column < startColumn &&\n          ranges[i].start.row == 0\n        )\n          i++;\n        var endRow = range.end.row - range.start.row;\n        while (\n          i < j &&\n          ranges[j].end.column > endColumn &&\n          ranges[j].end.row == endRow\n        )\n          j--;\n        ranges = ranges.slice(i, j + 1);\n        for (i = 0, j = ranges.length; i < j; i++) {\n          ranges[i].start.row += range.start.row;\n          ranges[i].end.row += range.start.row;\n        }\n      }\n      return ranges;\n    };\n    Search.prototype.replace = function (input, replacement) {\n      var options = this.$options;\n      var re = this.$assembleRegExp(options);\n      if (options.$isMultiLine) return replacement;\n      if (!re) return;\n      var match = re.exec(input);\n      if (!match || match[0].length != input.length) return null;\n      replacement = input.replace(re, replacement);\n      if (options.preserveCase) {\n        replacement = replacement.split(\"\");\n        for (var i = Math.min(input.length, input.length); i--; ) {\n          var ch = input[i];\n          if (ch && ch.toLowerCase() != ch)\n            replacement[i] = replacement[i].toUpperCase();\n          else replacement[i] = replacement[i].toLowerCase();\n        }\n        replacement = replacement.join(\"\");\n      }\n      return replacement;\n    };\n    Search.prototype.$assembleRegExp = function (\n      options,\n      $disableFakeMultiline,\n    ) {\n      if (options.needle instanceof RegExp)\n        return (options.re = options.needle);\n      var needle = options.needle;\n      if (!options.needle) return (options.re = false);\n      if (!options.regExp) needle = lang.escapeRegExp(needle);\n      var modifier = options.caseSensitive ? \"gm\" : \"gmi\";\n      try {\n        new RegExp(needle, \"u\");\n        options.$supportsUnicodeFlag = true;\n        modifier += \"u\";\n      } catch (e) {\n        options.$supportsUnicodeFlag = false; //left for backward compatibility with previous versions for cases like /ab\\{2}/gu\n      }\n      if (options.wholeWord) needle = addWordBoundary(needle, options);\n      options.$isMultiLine = !$disableFakeMultiline && /[\\n\\r]/.test(needle);\n      if (options.$isMultiLine)\n        return (options.re = this.$assembleMultilineRegExp(needle, modifier));\n      try {\n        var re = new RegExp(needle, modifier);\n      } catch (e) {\n        re = false;\n      }\n      return (options.re = re);\n    };\n    Search.prototype.$assembleMultilineRegExp = function (needle, modifier) {\n      var parts = needle.replace(/\\r\\n|\\r|\\n/g, \"$\\n^\").split(\"\\n\");\n      var re = [];\n      for (var i = 0; i < parts.length; i++)\n        try {\n          re.push(new RegExp(parts[i], modifier));\n        } catch (e) {\n          return false;\n        }\n      return re;\n    };\n    Search.prototype.$matchIterator = function (session, options) {\n      var re = this.$assembleRegExp(options);\n      if (!re) return false;\n      var backwards = options.backwards == true;\n      var skipCurrent = options.skipCurrent != false;\n      var supportsUnicodeFlag = re.unicode;\n      var range = options.range;\n      var start = options.start;\n      if (!start)\n        start = range\n          ? range[backwards ? \"end\" : \"start\"]\n          : session.selection.getRange();\n      if (start.start)\n        start = start[skipCurrent != backwards ? \"end\" : \"start\"];\n      var firstRow = range ? range.start.row : 0;\n      var lastRow = range ? range.end.row : session.getLength() - 1;\n      if (backwards) {\n        var forEach = function (callback) {\n          var row = start.row;\n          if (forEachInLine(row, start.column, callback)) return;\n          for (row--; row >= firstRow; row--)\n            if (forEachInLine(row, Number.MAX_VALUE, callback)) return;\n          if (options.wrap == false) return;\n          for (row = lastRow, firstRow = start.row; row >= firstRow; row--)\n            if (forEachInLine(row, Number.MAX_VALUE, callback)) return;\n        };\n      } else {\n        var forEach = function (callback) {\n          var row = start.row;\n          if (forEachInLine(row, start.column, callback)) return;\n          for (row = row + 1; row <= lastRow; row++)\n            if (forEachInLine(row, 0, callback)) return;\n          if (options.wrap == false) return;\n          for (row = firstRow, lastRow = start.row; row <= lastRow; row++)\n            if (forEachInLine(row, 0, callback)) return;\n        };\n      }\n      if (options.$isMultiLine) {\n        var len = re.length;\n        var forEachInLine = function (row, offset, callback) {\n          var startRow = backwards ? row - len + 1 : row;\n          if (startRow < 0 || startRow + len > session.getLength()) return;\n          var line = session.getLine(startRow);\n          var startIndex = line.search(re[0]);\n          if ((!backwards && startIndex < offset) || startIndex === -1) return;\n          for (var i = 1; i < len; i++) {\n            line = session.getLine(startRow + i);\n            if (line.search(re[i]) == -1) return;\n          }\n          var endIndex = line.match(re[len - 1])[0].length;\n          if (backwards && endIndex > offset) return;\n          if (callback(startRow, startIndex, startRow + len - 1, endIndex))\n            return true;\n        };\n      } else if (backwards) {\n        var forEachInLine = function (row, endIndex, callback) {\n          var line = session.getLine(row);\n          var matches = [];\n          var m,\n            last = 0;\n          re.lastIndex = 0;\n          while ((m = re.exec(line))) {\n            var length = m[0].length;\n            last = m.index;\n            if (!length) {\n              if (last >= line.length) break;\n              re.lastIndex = last += lang.skipEmptyMatch(\n                line,\n                last,\n                supportsUnicodeFlag,\n              );\n            }\n            if (m.index + length > endIndex) break;\n            matches.push(m.index, length);\n          }\n          for (var i = matches.length - 1; i >= 0; i -= 2) {\n            var column = matches[i - 1];\n            var length = matches[i];\n            if (callback(row, column, row, column + length)) return true;\n          }\n        };\n      } else {\n        var forEachInLine = function (row, startIndex, callback) {\n          var line = session.getLine(row);\n          var last;\n          var m;\n          re.lastIndex = startIndex;\n          while ((m = re.exec(line))) {\n            var length = m[0].length;\n            last = m.index;\n            if (callback(row, last, row, last + length)) return true;\n            if (!length) {\n              re.lastIndex = last += lang.skipEmptyMatch(\n                line,\n                last,\n                supportsUnicodeFlag,\n              );\n              if (last >= line.length) return false;\n            }\n          }\n        };\n      }\n      return { forEach: forEach };\n    };\n    return Search;\n  })();\n  function addWordBoundary(needle, options) {\n    var supportsLookbehind = lang.supportsLookbehind();\n    function wordBoundary(c, firstChar) {\n      if (firstChar === void 0) {\n        firstChar = true;\n      }\n      var wordRegExp =\n        supportsLookbehind && options.$supportsUnicodeFlag\n          ? new RegExp(\"[\\\\p{L}\\\\p{N}_]\", \"u\")\n          : new RegExp(\"\\\\w\");\n      if (wordRegExp.test(c) || options.regExp) {\n        if (supportsLookbehind && options.$supportsUnicodeFlag) {\n          if (firstChar) return \"(?<=^|[^\\\\p{L}\\\\p{N}_])\";\n          return \"(?=[^\\\\p{L}\\\\p{N}_]|$)\";\n        }\n        return \"\\\\b\";\n      }\n      return \"\";\n    }\n    var needleArray = Array.from(needle);\n    var firstChar = needleArray[0];\n    var lastChar = needleArray[needleArray.length - 1];\n    return wordBoundary(firstChar) + needle + wordBoundary(lastChar, false);\n  }\n  exports.Search = Search;\n});\n\ndefine(\"ace/keyboard/hash_handler\", [\n  \"require\",\n  \"exports\",\n  \"module\",\n  \"ace/lib/keys\",\n  \"ace/lib/useragent\",\n], function (require, exports, module) {\n  \"use strict\";\n  var __extends =\n    (this && this.__extends) ||\n    (function () {\n      var extendStatics = function (d, b) {\n        extendStatics =\n          Object.setPrototypeOf ||\n          ({ __proto__: [] } instanceof Array &&\n            function (d, b) {\n              d.__proto__ = b;\n            }) ||\n          function (d, b) {\n            for (var p in b)\n              if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p];\n          };\n        return extendStatics(d, b);\n      };\n      return function (d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\n            \"Class extends value \" +\n              String(b) +\n              \" is not a constructor or null\",\n          );\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype =\n          b === null\n            ? Object.create(b)\n            : ((__.prototype = b.prototype), new __());\n      };\n    })();\n  var keyUtil = require(\"../lib/keys\");\n  var useragent = require(\"../lib/useragent\");\n  var KEY_MODS = keyUtil.KEY_MODS;\n  var MultiHashHandler = /** @class */ (function () {\n    function MultiHashHandler(config, platform) {\n      this.$init(config, platform, false);\n    }\n    MultiHashHandler.prototype.$init = function (\n      config,\n      platform,\n      $singleCommand,\n    ) {\n      this.platform = platform || (useragent.isMac ? \"mac\" : \"win\");\n      this.commands = {};\n      this.commandKeyBinding = {};\n      this.addCommands(config);\n      this.$singleCommand = $singleCommand;\n    };\n    MultiHashHandler.prototype.addCommand = function (command) {\n      if (this.commands[command.name]) this.removeCommand(command);\n      this.commands[command.name] = command;\n      if (command.bindKey) this._buildKeyHash(command);\n    };\n    MultiHashHandler.prototype.removeCommand = function (command, keepCommand) {\n      var name =\n        command && (typeof command === \"string\" ? command : command.name);\n      command = this.commands[name];\n      if (!keepCommand) delete this.commands[name];\n      var ckb = this.commandKeyBinding;\n      for (var keyId in ckb) {\n        var cmdGroup = ckb[keyId];\n        if (cmdGroup == command) {\n          delete ckb[keyId];\n        } else if (Array.isArray(cmdGroup)) {\n          var i = cmdGroup.indexOf(command);\n          if (i != -1) {\n            cmdGroup.splice(i, 1);\n            if (cmdGroup.length == 1) ckb[keyId] = cmdGroup[0];\n          }\n        }\n      }\n    };\n    MultiHashHandler.prototype.bindKey = function (key, command, position) {\n      if (typeof key == \"object\" && key) {\n        if (position == undefined) position = key.position;\n        key = key[this.platform];\n      }\n      if (!key) return;\n      if (typeof command == \"function\")\n        return this.addCommand({\n          exec: command,\n          bindKey: key,\n          name: command.name || /**@type{string}*/ (key),\n        });\n      key.split(\"|\").forEach(function (keyPart) {\n        var chain = \"\";\n        if (keyPart.indexOf(\" \") != -1) {\n          var parts = keyPart.split(/\\s+/);\n          keyPart = parts.pop();\n          parts.forEach(function (keyPart) {\n            var binding = this.parseKeys(keyPart);\n            var id = KEY_MODS[binding.hashId] + binding.key;\n            chain += (chain ? \" \" : \"\") + id;\n            this._addCommandToBinding(chain, \"chainKeys\");\n          }, this);\n          chain += \" \";\n        }\n        var binding = this.parseKeys(keyPart);\n        var id = KEY_MODS[binding.hashId] + binding.key;\n        this._addCommandToBinding(chain + id, command, position);\n      }, this);\n    };\n    MultiHashHandler.prototype._addCommandToBinding = function (\n      keyId,\n      command,\n      position,\n    ) {\n      var ckb = this.commandKeyBinding,\n        i;\n      if (!command) {\n        delete ckb[keyId];\n      } else if (!ckb[keyId] || this.$singleCommand) {\n        ckb[keyId] = command;\n      } else {\n        if (!Array.isArray(ckb[keyId])) {\n          ckb[keyId] = [ckb[keyId]];\n        } else if ((i = ckb[keyId].indexOf(command)) != -1) {\n          ckb[keyId].splice(i, 1);\n        }\n        if (typeof position != \"number\") {\n          position = getPosition(command);\n        }\n        var commands = ckb[keyId];\n        for (i = 0; i < commands.length; i++) {\n          var other = commands[i];\n          var otherPos = getPosition(other);\n          if (otherPos > position) break;\n        }\n        commands.splice(i, 0, command);\n      }\n    };\n    MultiHashHandler.prototype.addCommands = function (commands) {\n      commands &&\n        Object.keys(commands).forEach(function (name) {\n          var command = commands[name];\n          if (!command) return;\n          if (typeof command === \"string\") return this.bindKey(command, name);\n          if (typeof command === \"function\") command = { exec: command };\n          if (typeof command !== \"object\") return;\n          if (!command.name) command.name = name;\n          this.addCommand(command);\n        }, this);\n    };\n    MultiHashHandler.prototype.removeCommands = function (commands) {\n      Object.keys(commands).forEach(function (name) {\n        this.removeCommand(commands[name]);\n      }, this);\n    };\n    MultiHashHandler.prototype.bindKeys = function (keyList) {\n      Object.keys(keyList).forEach(function (key) {\n        this.bindKey(key, keyList[key]);\n      }, this);\n    };\n    MultiHashHandler.prototype._buildKeyHash = function (command) {\n      this.bindKey(command.bindKey, command);\n    };\n    MultiHashHandler.prototype.parseKeys = function (keys) {\n      var parts = keys\n        .toLowerCase()\n        .split(/[\\-\\+]([\\-\\+])?/)\n        .filter(function (x) {\n          return x;\n        });\n      var key = parts.pop();\n      var keyCode = keyUtil[key];\n      if (keyUtil.FUNCTION_KEYS[keyCode])\n        key = keyUtil.FUNCTION_KEYS[keyCode].toLowerCase();\n      else if (!parts.length) return { key: key, hashId: -1 };\n      else if (parts.length == 1 && parts[0] == \"shift\")\n        return { key: key.toUpperCase(), hashId: -1 };\n      var hashId = 0;\n      for (var i = parts.length; i--; ) {\n        var modifier = keyUtil.KEY_MODS[parts[i]];\n        if (modifier == null) {\n          if (typeof console != \"undefined\")\n            console.error(\"invalid modifier \" + parts[i] + \" in \" + keys);\n          return false;\n        }\n        hashId |= modifier;\n      }\n      return { key: key, hashId: hashId };\n    };\n    MultiHashHandler.prototype.findKeyCommand = function (hashId, keyString) {\n      var key = KEY_MODS[hashId] + keyString;\n      return this.commandKeyBinding[key];\n    };\n    MultiHashHandler.prototype.handleKeyboard = function (\n      data,\n      hashId,\n      keyString,\n      keyCode,\n    ) {\n      if (keyCode < 0) return;\n      var key = KEY_MODS[hashId] + keyString;\n      var command = this.commandKeyBinding[key];\n      if (data.$keyChain) {\n        data.$keyChain += \" \" + key;\n        command = this.commandKeyBinding[data.$keyChain] || command;\n      }\n      if (command) {\n        if (\n          command == \"chainKeys\" ||\n          command[command.length - 1] == \"chainKeys\"\n        ) {\n          data.$keyChain = data.$keyChain || key;\n          return { command: \"null\" };\n        }\n      }\n      if (data.$keyChain) {\n        if ((!hashId || hashId == 4) && keyString.length == 1)\n          data.$keyChain = data.$keyChain.slice(\n            0,\n            -key.length - 1,\n          ); // wait for input\n        else if (hashId == -1 || keyCode > 0) data.$keyChain = \"\"; // reset keyChain\n      }\n      return { command: command };\n    };\n    MultiHashHandler.prototype.getStatusText = function (editor, data) {\n      return data.$keyChain || \"\";\n    };\n    return MultiHashHandler;\n  })();\n  function getPosition(command) {\n    return (\n      (typeof command == \"object\" &&\n        command.bindKey &&\n        command.bindKey.position) ||\n      (command.isDefault ? -100 : 0)\n    );\n  }\n  var HashHandler = /** @class */ (function (_super) {\n    __extends(HashHandler, _super);\n    function HashHandler(config, platform) {\n      var _this = _super.call(this, config, platform) || this;\n      _this.$singleCommand = true;\n      return _this;\n    }\n    return HashHandler;\n  })(MultiHashHandler);\n  HashHandler.call = function (thisArg, config, platform) {\n    MultiHashHandler.prototype.$init.call(thisArg, config, platform, true);\n  };\n  MultiHashHandler.call = function (thisArg, config, platform) {\n    MultiHashHandler.prototype.$init.call(thisArg, config, platform, false);\n  };\n  exports.HashHandler = HashHandler;\n  exports.MultiHashHandler = MultiHashHandler;\n});\n\ndefine(\"ace/commands/command_manager\", [\n  \"require\",\n  \"exports\",\n  \"module\",\n  \"ace/lib/oop\",\n  \"ace/keyboard/hash_handler\",\n  \"ace/lib/event_emitter\",\n], function (require, exports, module) {\n  \"use strict\";\n  var __extends =\n    (this && this.__extends) ||\n    (function () {\n      var extendStatics = function (d, b) {\n        extendStatics =\n          Object.setPrototypeOf ||\n          ({ __proto__: [] } instanceof Array &&\n            function (d, b) {\n              d.__proto__ = b;\n            }) ||\n          function (d, b) {\n            for (var p in b)\n              if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p];\n          };\n        return extendStatics(d, b);\n      };\n      return function (d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\n            \"Class extends value \" +\n              String(b) +\n              \" is not a constructor or null\",\n          );\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype =\n          b === null\n            ? Object.create(b)\n            : ((__.prototype = b.prototype), new __());\n      };\n    })();\n  var oop = require(\"../lib/oop\");\n  var MultiHashHandler = require(\"../keyboard/hash_handler\").MultiHashHandler;\n  var EventEmitter = require(\"../lib/event_emitter\").EventEmitter;\n  var CommandManager = /** @class */ (function (_super) {\n    __extends(CommandManager, _super);\n    function CommandManager(platform, commands) {\n      var _this = _super.call(this, commands, platform) || this;\n      _this.byName = _this.commands;\n      _this.setDefaultHandler(\"exec\", function (e) {\n        if (!e.args) {\n          return e.command.exec(e.editor, {}, e.event, true);\n        }\n        return e.command.exec(e.editor, e.args, e.event, false);\n      });\n      return _this;\n    }\n    CommandManager.prototype.exec = function (command, editor, args) {\n      if (Array.isArray(command)) {\n        for (var i = command.length; i--; ) {\n          if (this.exec(command[i], editor, args)) return true;\n        }\n        return false;\n      }\n      if (typeof command === \"string\") command = this.commands[command];\n      if (!command) return false;\n      if (editor && editor.$readOnly && !command.readOnly) return false;\n      if (\n        this.$checkCommandState != false &&\n        command.isAvailable &&\n        !command.isAvailable(editor)\n      )\n        return false;\n      var e = { editor: editor, command: command, args: args };\n      e.returnValue = this._emit(\"exec\", e);\n      this._signal(\"afterExec\", e);\n      return e.returnValue === false ? false : true;\n    };\n    CommandManager.prototype.toggleRecording = function (editor) {\n      if (this.$inReplay) return;\n      editor && editor._emit(\"changeStatus\");\n      if (this.recording) {\n        this.macro.pop();\n        this.off(\"exec\", this.$addCommandToMacro);\n        if (!this.macro.length) this.macro = this.oldMacro;\n        return (this.recording = false);\n      }\n      if (!this.$addCommandToMacro) {\n        this.$addCommandToMacro = function (e) {\n          this.macro.push([e.command, e.args]);\n        }.bind(this);\n      }\n      this.oldMacro = this.macro;\n      this.macro = [];\n      this.on(\"exec\", this.$addCommandToMacro);\n      return (this.recording = true);\n    };\n    CommandManager.prototype.replay = function (editor) {\n      if (this.$inReplay || !this.macro) return;\n      if (this.recording) return this.toggleRecording(editor);\n      try {\n        this.$inReplay = true;\n        this.macro.forEach(function (x) {\n          if (typeof x == \"string\") this.exec(x, editor);\n          else this.exec(x[0], editor, x[1]);\n        }, this);\n      } finally {\n        this.$inReplay = false;\n      }\n    };\n    CommandManager.prototype.trimMacro = function (m) {\n      return m.map(function (x) {\n        if (typeof x[0] != \"string\") x[0] = x[0].name;\n        if (!x[1]) x = x[0];\n        return x;\n      });\n    };\n    return CommandManager;\n  })(MultiHashHandler);\n  oop.implement(CommandManager.prototype, EventEmitter);\n  exports.CommandManager = CommandManager;\n});\n\ndefine(\"ace/commands/default_commands\", [\n  \"require\",\n  \"exports\",\n  \"module\",\n  \"ace/lib/lang\",\n  \"ace/config\",\n  \"ace/range\",\n], function (require, exports, module) {\n  \"use strict\";\n  var lang = require(\"../lib/lang\");\n  var config = require(\"../config\");\n  var Range = require(\"../range\").Range;\n  function bindKey(win, mac) {\n    return { win: win, mac: mac };\n  }\n  exports.commands = [\n    {\n      name: \"showSettingsMenu\",\n      description: \"Show settings menu\",\n      bindKey: bindKey(\"Ctrl-,\", \"Command-,\"),\n      exec: function (editor) {\n        config.loadModule(\"ace/ext/settings_menu\", function (module) {\n          module.init(editor);\n          editor.showSettingsMenu();\n        });\n      },\n      readOnly: true,\n    },\n    {\n      name: \"goToNextError\",\n      description: \"Go to next error\",\n      bindKey: bindKey(\"Alt-E\", \"F4\"),\n      exec: function (editor) {\n        config.loadModule(\"ace/ext/error_marker\", function (module) {\n          module.showErrorMarker(editor, 1);\n        });\n      },\n      scrollIntoView: \"animate\",\n      readOnly: true,\n    },\n    {\n      name: \"goToPreviousError\",\n      description: \"Go to previous error\",\n      bindKey: bindKey(\"Alt-Shift-E\", \"Shift-F4\"),\n      exec: function (editor) {\n        config.loadModule(\"ace/ext/error_marker\", function (module) {\n          module.showErrorMarker(editor, -1);\n        });\n      },\n      scrollIntoView: \"animate\",\n      readOnly: true,\n    },\n    {\n      name: \"selectall\",\n      description: \"Select all\",\n      bindKey: bindKey(\"Ctrl-A\", \"Command-A\"),\n      exec: function (editor) {\n        editor.selectAll();\n      },\n      readOnly: true,\n    },\n    {\n      name: \"centerselection\",\n      description: \"Center selection\",\n      bindKey: bindKey(null, \"Ctrl-L\"),\n      exec: function (editor) {\n        editor.centerSelection();\n      },\n      readOnly: true,\n    },\n    {\n      name: \"gotoline\",\n      description: \"Go to line...\",\n      bindKey: bindKey(\"Ctrl-L\", \"Command-L\"),\n      exec: function (editor, line) {\n        if (typeof line === \"number\" && !isNaN(line)) editor.gotoLine(line);\n        editor.prompt({ $type: \"gotoLine\" });\n      },\n      readOnly: true,\n    },\n    {\n      name: \"fold\",\n      bindKey: bindKey(\"Alt-L|Ctrl-F1\", \"Command-Alt-L|Command-F1\"),\n      exec: function (editor) {\n        editor.session.toggleFold(false);\n      },\n      multiSelectAction: \"forEach\",\n      scrollIntoView: \"center\",\n      readOnly: true,\n    },\n    {\n      name: \"unfold\",\n      bindKey: bindKey(\n        \"Alt-Shift-L|Ctrl-Shift-F1\",\n        \"Command-Alt-Shift-L|Command-Shift-F1\",\n      ),\n      exec: function (editor) {\n        editor.session.toggleFold(true);\n      },\n      multiSelectAction: \"forEach\",\n      scrollIntoView: \"center\",\n      readOnly: true,\n    },\n    {\n      name: \"toggleFoldWidget\",\n      description: \"Toggle fold widget\",\n      bindKey: bindKey(\"F2\", \"F2\"),\n      exec: function (editor) {\n        editor.session.toggleFoldWidget();\n      },\n      multiSelectAction: \"forEach\",\n      scrollIntoView: \"center\",\n      readOnly: true,\n    },\n    {\n      name: \"toggleParentFoldWidget\",\n      description: \"Toggle parent fold widget\",\n      bindKey: bindKey(\"Alt-F2\", \"Alt-F2\"),\n      exec: function (editor) {\n        editor.session.toggleFoldWidget(true);\n      },\n      multiSelectAction: \"forEach\",\n      scrollIntoView: \"center\",\n      readOnly: true,\n    },\n    {\n      name: \"foldall\",\n      description: \"Fold all\",\n      bindKey: bindKey(null, \"Ctrl-Command-Option-0\"),\n      exec: function (editor) {\n        editor.session.foldAll();\n      },\n      scrollIntoView: \"center\",\n      readOnly: true,\n    },\n    {\n      name: \"foldAllComments\",\n      description: \"Fold all comments\",\n      bindKey: bindKey(null, \"Ctrl-Command-Option-0\"),\n      exec: function (editor) {\n        editor.session.foldAllComments();\n      },\n      scrollIntoView: \"center\",\n      readOnly: true,\n    },\n    {\n      name: \"foldOther\",\n      description: \"Fold other\",\n      bindKey: bindKey(\"Alt-0\", \"Command-Option-0\"),\n      exec: function (editor) {\n        editor.session.foldAll();\n        editor.session.unfold(editor.selection.getAllRanges());\n      },\n      scrollIntoView: \"center\",\n      readOnly: true,\n    },\n    {\n      name: \"unfoldall\",\n      description: \"Unfold all\",\n      bindKey: bindKey(\"Alt-Shift-0\", \"Command-Option-Shift-0\"),\n      exec: function (editor) {\n        editor.session.unfold();\n      },\n      scrollIntoView: \"center\",\n      readOnly: true,\n    },\n    {\n      name: \"findnext\",\n      description: \"Find next\",\n      bindKey: bindKey(\"Ctrl-K\", \"Command-G\"),\n      exec: function (editor) {\n        editor.findNext();\n      },\n      multiSelectAction: \"forEach\",\n      scrollIntoView: \"center\",\n      readOnly: true,\n    },\n    {\n      name: \"findprevious\",\n      description: \"Find previous\",\n      bindKey: bindKey(\"Ctrl-Shift-K\", \"Command-Shift-G\"),\n      exec: function (editor) {\n        editor.findPrevious();\n      },\n      multiSelectAction: \"forEach\",\n      scrollIntoView: \"center\",\n      readOnly: true,\n    },\n    {\n      name: \"selectOrFindNext\",\n      description: \"Select or find next\",\n      bindKey: bindKey(\"Alt-K\", \"Ctrl-G\"),\n      exec: function (editor) {\n        if (editor.selection.isEmpty()) editor.selection.selectWord();\n        else editor.findNext();\n      },\n      readOnly: true,\n    },\n    {\n      name: \"selectOrFindPrevious\",\n      description: \"Select or find previous\",\n      bindKey: bindKey(\"Alt-Shift-K\", \"Ctrl-Shift-G\"),\n      exec: function (editor) {\n        if (editor.selection.isEmpty()) editor.selection.selectWord();\n        else editor.findPrevious();\n      },\n      readOnly: true,\n    },\n    {\n      name: \"find\",\n      description: \"Find\",\n      bindKey: bindKey(\"Ctrl-F\", \"Command-F\"),\n      exec: function (editor) {\n        config.loadModule(\"ace/ext/searchbox\", function (e) {\n          e.Search(editor);\n        });\n      },\n      readOnly: true,\n    },\n    {\n      name: \"overwrite\",\n      description: \"Overwrite\",\n      bindKey: \"Insert\",\n      exec: function (editor) {\n        editor.toggleOverwrite();\n      },\n      readOnly: true,\n    },\n    {\n      name: \"selecttostart\",\n      description: \"Select to start\",\n      bindKey: bindKey(\n        \"Ctrl-Shift-Home\",\n        \"Command-Shift-Home|Command-Shift-Up\",\n      ),\n      exec: function (editor) {\n        editor.getSelection().selectFileStart();\n      },\n      multiSelectAction: \"forEach\",\n      readOnly: true,\n      scrollIntoView: \"animate\",\n      aceCommandGroup: \"fileJump\",\n    },\n    {\n      name: \"gotostart\",\n      description: \"Go to start\",\n      bindKey: bindKey(\"Ctrl-Home\", \"Command-Home|Command-Up\"),\n      exec: function (editor) {\n        editor.navigateFileStart();\n      },\n      multiSelectAction: \"forEach\",\n      readOnly: true,\n      scrollIntoView: \"animate\",\n      aceCommandGroup: \"fileJump\",\n    },\n    {\n      name: \"selectup\",\n      description: \"Select up\",\n      bindKey: bindKey(\"Shift-Up\", \"Shift-Up|Ctrl-Shift-P\"),\n      exec: function (editor) {\n        editor.getSelection().selectUp();\n      },\n      multiSelectAction: \"forEach\",\n      scrollIntoView: \"cursor\",\n      readOnly: true,\n    },\n    {\n      name: \"golineup\",\n      description: \"Go line up\",\n      bindKey: bindKey(\"Up\", \"Up|Ctrl-P\"),\n      exec: function (editor, args) {\n        editor.navigateUp(args.times);\n      },\n      multiSelectAction: \"forEach\",\n      scrollIntoView: \"cursor\",\n      readOnly: true,\n    },\n    {\n      name: \"selecttoend\",\n      description: \"Select to end\",\n      bindKey: bindKey(\n        \"Ctrl-Shift-End\",\n        \"Command-Shift-End|Command-Shift-Down\",\n      ),\n      exec: function (editor) {\n        editor.getSelection().selectFileEnd();\n      },\n      multiSelectAction: \"forEach\",\n      readOnly: true,\n      scrollIntoView: \"animate\",\n      aceCommandGroup: \"fileJump\",\n    },\n    {\n      name: \"gotoend\",\n      description: \"Go to end\",\n      bindKey: bindKey(\"Ctrl-End\", \"Command-End|Command-Down\"),\n      exec: function (editor) {\n        editor.navigateFileEnd();\n      },\n      multiSelectAction: \"forEach\",\n      readOnly: true,\n      scrollIntoView: \"animate\",\n      aceCommandGroup: \"fileJump\",\n    },\n    {\n      name: \"selectdown\",\n      description: \"Select down\",\n      bindKey: bindKey(\"Shift-Down\", \"Shift-Down|Ctrl-Shift-N\"),\n      exec: function (editor) {\n        editor.getSelection().selectDown();\n      },\n      multiSelectAction: \"forEach\",\n      scrollIntoView: \"cursor\",\n      readOnly: true,\n    },\n    {\n      name: \"golinedown\",\n      description: \"Go line down\",\n      bindKey: bindKey(\"Down\", \"Down|Ctrl-N\"),\n      exec: function (editor, args) {\n        editor.navigateDown(args.times);\n      },\n      multiSelectAction: \"forEach\",\n      scrollIntoView: \"cursor\",\n      readOnly: true,\n    },\n    {\n      name: \"selectwordleft\",\n      description: \"Select word left\",\n      bindKey: bindKey(\"Ctrl-Shift-Left\", \"Option-Shift-Left\"),\n      exec: function (editor) {\n        editor.getSelection().selectWordLeft();\n      },\n      multiSelectAction: \"forEach\",\n      scrollIntoView: \"cursor\",\n      readOnly: true,\n    },\n    {\n      name: \"gotowordleft\",\n      description: \"Go to word left\",\n      bindKey: bindKey(\"Ctrl-Left\", \"Option-Left\"),\n      exec: function (editor) {\n        editor.navigateWordLeft();\n      },\n      multiSelectAction: \"forEach\",\n      scrollIntoView: \"cursor\",\n      readOnly: true,\n    },\n    {\n      name: \"selecttolinestart\",\n      description: \"Select to line start\",\n      bindKey: bindKey(\"Alt-Shift-Left\", \"Command-Shift-Left|Ctrl-Shift-A\"),\n      exec: function (editor) {\n        editor.getSelection().selectLineStart();\n      },\n      multiSelectAction: \"forEach\",\n      scrollIntoView: \"cursor\",\n      readOnly: true,\n    },\n    {\n      name: \"gotolinestart\",\n      description: \"Go to line start\",\n      bindKey: bindKey(\"Alt-Left|Home\", \"Command-Left|Home|Ctrl-A\"),\n      exec: function (editor) {\n        editor.navigateLineStart();\n      },\n      multiSelectAction: \"forEach\",\n      scrollIntoView: \"cursor\",\n      readOnly: true,\n    },\n    {\n      name: \"selectleft\",\n      description: \"Select left\",\n      bindKey: bindKey(\"Shift-Left\", \"Shift-Left|Ctrl-Shift-B\"),\n      exec: function (editor) {\n        editor.getSelection().selectLeft();\n      },\n      multiSelectAction: \"forEach\",\n      scrollIntoView: \"cursor\",\n      readOnly: true,\n    },\n    {\n      name: \"gotoleft\",\n      description: \"Go to left\",\n      bindKey: bindKey(\"Left\", \"Left|Ctrl-B\"),\n      exec: function (editor, args) {\n        editor.navigateLeft(args.times);\n      },\n      multiSelectAction: \"forEach\",\n      scrollIntoView: \"cursor\",\n      readOnly: true,\n    },\n    {\n      name: \"selectwordright\",\n      description: \"Select word right\",\n      bindKey: bindKey(\"Ctrl-Shift-Right\", \"Option-Shift-Right\"),\n      exec: function (editor) {\n        editor.getSelection().selectWordRight();\n      },\n      multiSelectAction: \"forEach\",\n      scrollIntoView: \"cursor\",\n      readOnly: true,\n    },\n    {\n      name: \"gotowordright\",\n      description: \"Go to word right\",\n      bindKey: bindKey(\"Ctrl-Right\", \"Option-Right\"),\n      exec: function (editor) {\n        editor.navigateWordRight();\n      },\n      multiSelectAction: \"forEach\",\n      scrollIntoView: \"cursor\",\n      readOnly: true,\n    },\n    {\n      name: \"selecttolineend\",\n      description: \"Select to line end\",\n      bindKey: bindKey(\n        \"Alt-Shift-Right\",\n        \"Command-Shift-Right|Shift-End|Ctrl-Shift-E\",\n      ),\n      exec: function (editor) {\n        editor.getSelection().selectLineEnd();\n      },\n      multiSelectAction: \"forEach\",\n      scrollIntoView: \"cursor\",\n      readOnly: true,\n    },\n    {\n      name: \"gotolineend\",\n      description: \"Go to line end\",\n      bindKey: bindKey(\"Alt-Right|End\", \"Command-Right|End|Ctrl-E\"),\n      exec: function (editor) {\n        editor.navigateLineEnd();\n      },\n      multiSelectAction: \"forEach\",\n      scrollIntoView: \"cursor\",\n      readOnly: true,\n    },\n    {\n      name: \"selectright\",\n      description: \"Select right\",\n      bindKey: bindKey(\"Shift-Right\", \"Shift-Right\"),\n      exec: function (editor) {\n        editor.getSelection().selectRight();\n      },\n      multiSelectAction: \"forEach\",\n      scrollIntoView: \"cursor\",\n      readOnly: true,\n    },\n    {\n      name: \"gotoright\",\n      description: \"Go to right\",\n      bindKey: bindKey(\"Right\", \"Right|Ctrl-F\"),\n      exec: function (editor, args) {\n        editor.navigateRight(args.times);\n      },\n      multiSelectAction: \"forEach\",\n      scrollIntoView: \"cursor\",\n      readOnly: true,\n    },\n    {\n      name: \"selectpagedown\",\n      description: \"Select page down\",\n      bindKey: \"Shift-PageDown\",\n      exec: function (editor) {\n        editor.selectPageDown();\n      },\n      readOnly: true,\n    },\n    {\n      name: \"pagedown\",\n      description: \"Page down\",\n      bindKey: bindKey(null, \"Option-PageDown\"),\n      exec: function (editor) {\n        editor.scrollPageDown();\n      },\n      readOnly: true,\n    },\n    {\n      name: \"gotopagedown\",\n      description: \"Go to page down\",\n      bindKey: bindKey(\"PageDown\", \"PageDown|Ctrl-V\"),\n      exec: function (editor) {\n        editor.gotoPageDown();\n      },\n      readOnly: true,\n    },\n    {\n      name: \"selectpageup\",\n      description: \"Select page up\",\n      bindKey: \"Shift-PageUp\",\n      exec: function (editor) {\n        editor.selectPageUp();\n      },\n      readOnly: true,\n    },\n    {\n      name: \"pageup\",\n      description: \"Page up\",\n      bindKey: bindKey(null, \"Option-PageUp\"),\n      exec: function (editor) {\n        editor.scrollPageUp();\n      },\n      readOnly: true,\n    },\n    {\n      name: \"gotopageup\",\n      description: \"Go to page up\",\n      bindKey: \"PageUp\",\n      exec: function (editor) {\n        editor.gotoPageUp();\n      },\n      readOnly: true,\n    },\n    {\n      name: \"scrollup\",\n      description: \"Scroll up\",\n      bindKey: bindKey(\"Ctrl-Up\", null),\n      exec: function (e) {\n        e.renderer.scrollBy(0, -2 * e.renderer.layerConfig.lineHeight);\n      },\n      readOnly: true,\n    },\n    {\n      name: \"scrolldown\",\n      description: \"Scroll down\",\n      bindKey: bindKey(\"Ctrl-Down\", null),\n      exec: function (e) {\n        e.renderer.scrollBy(0, 2 * e.renderer.layerConfig.lineHeight);\n      },\n      readOnly: true,\n    },\n    {\n      name: \"selectlinestart\",\n      description: \"Select line start\",\n      bindKey: \"Shift-Home\",\n      exec: function (editor) {\n        editor.getSelection().selectLineStart();\n      },\n      multiSelectAction: \"forEach\",\n      scrollIntoView: \"cursor\",\n      readOnly: true,\n    },\n    {\n      name: \"selectlineend\",\n      description: \"Select line end\",\n      bindKey: \"Shift-End\",\n      exec: function (editor) {\n        editor.getSelection().selectLineEnd();\n      },\n      multiSelectAction: \"forEach\",\n      scrollIntoView: \"cursor\",\n      readOnly: true,\n    },\n    {\n      name: \"togglerecording\",\n      description: \"Toggle recording\",\n      bindKey: bindKey(\"Ctrl-Alt-E\", \"Command-Option-E\"),\n      exec: function (editor) {\n        editor.commands.toggleRecording(editor);\n      },\n      readOnly: true,\n    },\n    {\n      name: \"replaymacro\",\n      description: \"Replay macro\",\n      bindKey: bindKey(\"Ctrl-Shift-E\", \"Command-Shift-E\"),\n      exec: function (editor) {\n        editor.commands.replay(editor);\n      },\n      readOnly: true,\n    },\n    {\n      name: \"jumptomatching\",\n      description: \"Jump to matching\",\n      bindKey: bindKey(\"Ctrl-\\\\|Ctrl-P\", \"Command-\\\\\"),\n      exec: function (editor) {\n        editor.jumpToMatching();\n      },\n      multiSelectAction: \"forEach\",\n      scrollIntoView: \"animate\",\n      readOnly: true,\n    },\n    {\n      name: \"selecttomatching\",\n      description: \"Select to matching\",\n      bindKey: bindKey(\"Ctrl-Shift-\\\\|Ctrl-Shift-P\", \"Command-Shift-\\\\\"),\n      exec: function (editor) {\n        editor.jumpToMatching(true);\n      },\n      multiSelectAction: \"forEach\",\n      scrollIntoView: \"animate\",\n      readOnly: true,\n    },\n    {\n      name: \"expandToMatching\",\n      description: \"Expand to matching\",\n      bindKey: bindKey(\"Ctrl-Shift-M\", \"Ctrl-Shift-M\"),\n      exec: function (editor) {\n        editor.jumpToMatching(true, true);\n      },\n      multiSelectAction: \"forEach\",\n      scrollIntoView: \"animate\",\n      readOnly: true,\n    },\n    {\n      name: \"passKeysToBrowser\",\n      description: \"Pass keys to browser\",\n      bindKey: bindKey(null, null),\n      exec: function () {},\n      passEvent: true,\n      readOnly: true,\n    },\n    {\n      name: \"copy\",\n      description: \"Copy\",\n      exec: function (editor) {},\n      readOnly: true,\n    },\n    {\n      name: \"cut\",\n      description: \"Cut\",\n      exec: function (editor) {\n        var cutLine =\n          editor.$copyWithEmptySelection && editor.selection.isEmpty();\n        var range = cutLine\n          ? editor.selection.getLineRange()\n          : editor.selection.getRange();\n        editor._emit(\"cut\", range);\n        if (!range.isEmpty()) editor.session.remove(range);\n        editor.clearSelection();\n      },\n      scrollIntoView: \"cursor\",\n      multiSelectAction: \"forEach\",\n    },\n    {\n      name: \"paste\",\n      description: \"Paste\",\n      exec: function (editor, args) {\n        editor.$handlePaste(args);\n      },\n      scrollIntoView: \"cursor\",\n    },\n    {\n      name: \"removeline\",\n      description: \"Remove line\",\n      bindKey: bindKey(\"Ctrl-D\", \"Command-D\"),\n      exec: function (editor) {\n        editor.removeLines();\n      },\n      scrollIntoView: \"cursor\",\n      multiSelectAction: \"forEachLine\",\n    },\n    {\n      name: \"duplicateSelection\",\n      description: \"Duplicate selection\",\n      bindKey: bindKey(\"Ctrl-Shift-D\", \"Command-Shift-D\"),\n      exec: function (editor) {\n        editor.duplicateSelection();\n      },\n      scrollIntoView: \"cursor\",\n      multiSelectAction: \"forEach\",\n    },\n    {\n      name: \"sortlines\",\n      description: \"Sort lines\",\n      bindKey: bindKey(\"Ctrl-Alt-S\", \"Command-Alt-S\"),\n      exec: function (editor) {\n        editor.sortLines();\n      },\n      scrollIntoView: \"selection\",\n      multiSelectAction: \"forEachLine\",\n    },\n    {\n      name: \"togglecomment\",\n      description: \"Toggle comment\",\n      bindKey: bindKey(\"Ctrl-/\", \"Command-/\"),\n      exec: function (editor) {\n        editor.toggleCommentLines();\n      },\n      multiSelectAction: \"forEachLine\",\n      scrollIntoView: \"selectionPart\",\n    },\n    {\n      name: \"toggleBlockComment\",\n      description: \"Toggle block comment\",\n      bindKey: bindKey(\"Ctrl-Shift-/\", \"Command-Shift-/\"),\n      exec: function (editor) {\n        editor.toggleBlockComment();\n      },\n      multiSelectAction: \"forEach\",\n      scrollIntoView: \"selectionPart\",\n    },\n    {\n      name: \"modifyNumberUp\",\n      description: \"Modify number up\",\n      bindKey: bindKey(\"Ctrl-Shift-Up\", \"Alt-Shift-Up\"),\n      exec: function (editor) {\n        editor.modifyNumber(1);\n      },\n      scrollIntoView: \"cursor\",\n      multiSelectAction: \"forEach\",\n    },\n    {\n      name: \"modifyNumberDown\",\n      description: \"Modify number down\",\n      bindKey: bindKey(\"Ctrl-Shift-Down\", \"Alt-Shift-Down\"),\n      exec: function (editor) {\n        editor.modifyNumber(-1);\n      },\n      scrollIntoView: \"cursor\",\n      multiSelectAction: \"forEach\",\n    },\n    {\n      name: \"replace\",\n      description: \"Replace\",\n      bindKey: bindKey(\"Ctrl-H\", \"Command-Option-F\"),\n      exec: function (editor) {\n        config.loadModule(\"ace/ext/searchbox\", function (e) {\n          e.Search(editor, true);\n        });\n      },\n    },\n    {\n      name: \"undo\",\n      description: \"Undo\",\n      bindKey: bindKey(\"Ctrl-Z\", \"Command-Z\"),\n      exec: function (editor) {\n        editor.undo();\n      },\n    },\n    {\n      name: \"redo\",\n      description: \"Redo\",\n      bindKey: bindKey(\"Ctrl-Shift-Z|Ctrl-Y\", \"Command-Shift-Z|Command-Y\"),\n      exec: function (editor) {\n        editor.redo();\n      },\n    },\n    {\n      name: \"copylinesup\",\n      description: \"Copy lines up\",\n      bindKey: bindKey(\"Alt-Shift-Up\", \"Command-Option-Up\"),\n      exec: function (editor) {\n        editor.copyLinesUp();\n      },\n      scrollIntoView: \"cursor\",\n    },\n    {\n      name: \"movelinesup\",\n      description: \"Move lines up\",\n      bindKey: bindKey(\"Alt-Up\", \"Option-Up\"),\n      exec: function (editor) {\n        editor.moveLinesUp();\n      },\n      scrollIntoView: \"cursor\",\n    },\n    {\n      name: \"copylinesdown\",\n      description: \"Copy lines down\",\n      bindKey: bindKey(\"Alt-Shift-Down\", \"Command-Option-Down\"),\n      exec: function (editor) {\n        editor.copyLinesDown();\n      },\n      scrollIntoView: \"cursor\",\n    },\n    {\n      name: \"movelinesdown\",\n      description: \"Move lines down\",\n      bindKey: bindKey(\"Alt-Down\", \"Option-Down\"),\n      exec: function (editor) {\n        editor.moveLinesDown();\n      },\n      scrollIntoView: \"cursor\",\n    },\n    {\n      name: \"del\",\n      description: \"Delete\",\n      bindKey: bindKey(\"Delete\", \"Delete|Ctrl-D|Shift-Delete\"),\n      exec: function (editor) {\n        editor.remove(\"right\");\n      },\n      multiSelectAction: \"forEach\",\n      scrollIntoView: \"cursor\",\n    },\n    {\n      name: \"backspace\",\n      description: \"Backspace\",\n      bindKey: bindKey(\n        \"Shift-Backspace|Backspace\",\n        \"Ctrl-Backspace|Shift-Backspace|Backspace|Ctrl-H\",\n      ),\n      exec: function (editor) {\n        editor.remove(\"left\");\n      },\n      multiSelectAction: \"forEach\",\n      scrollIntoView: \"cursor\",\n    },\n    {\n      name: \"cut_or_delete\",\n      description: \"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      scrollIntoView: \"cursor\",\n    },\n    {\n      name: \"removetolinestart\",\n      description: \"Remove to line start\",\n      bindKey: bindKey(\"Alt-Backspace\", \"Command-Backspace\"),\n      exec: function (editor) {\n        editor.removeToLineStart();\n      },\n      multiSelectAction: \"forEach\",\n      scrollIntoView: \"cursor\",\n    },\n    {\n      name: \"removetolineend\",\n      description: \"Remove to line end\",\n      bindKey: bindKey(\"Alt-Delete\", \"Ctrl-K|Command-Delete\"),\n      exec: function (editor) {\n        editor.removeToLineEnd();\n      },\n      multiSelectAction: \"forEach\",\n      scrollIntoView: \"cursor\",\n    },\n    {\n      name: \"removetolinestarthard\",\n      description: \"Remove to line start hard\",\n      bindKey: bindKey(\"Ctrl-Shift-Backspace\", null),\n      exec: function (editor) {\n        var range = editor.selection.getRange();\n        range.start.column = 0;\n        editor.session.remove(range);\n      },\n      multiSelectAction: \"forEach\",\n      scrollIntoView: \"cursor\",\n    },\n    {\n      name: \"removetolineendhard\",\n      description: \"Remove to line end hard\",\n      bindKey: bindKey(\"Ctrl-Shift-Delete\", null),\n      exec: function (editor) {\n        var range = editor.selection.getRange();\n        range.end.column = Number.MAX_VALUE;\n        editor.session.remove(range);\n      },\n      multiSelectAction: \"forEach\",\n      scrollIntoView: \"cursor\",\n    },\n    {\n      name: \"removewordleft\",\n      description: \"Remove word left\",\n      bindKey: bindKey(\"Ctrl-Backspace\", \"Alt-Backspace|Ctrl-Alt-Backspace\"),\n      exec: function (editor) {\n        editor.removeWordLeft();\n      },\n      multiSelectAction: \"forEach\",\n      scrollIntoView: \"cursor\",\n    },\n    {\n      name: \"removewordright\",\n      description: \"Remove word right\",\n      bindKey: bindKey(\"Ctrl-Delete\", \"Alt-Delete\"),\n      exec: function (editor) {\n        editor.removeWordRight();\n      },\n      multiSelectAction: \"forEach\",\n      scrollIntoView: \"cursor\",\n    },\n    {\n      name: \"outdent\",\n      description: \"Outdent\",\n      bindKey: bindKey(\"Shift-Tab\", \"Shift-Tab\"),\n      exec: function (editor) {\n        editor.blockOutdent();\n      },\n      multiSelectAction: \"forEach\",\n      scrollIntoView: \"selectionPart\",\n    },\n    {\n      name: \"indent\",\n      description: \"Indent\",\n      bindKey: bindKey(\"Tab\", \"Tab\"),\n      exec: function (editor) {\n        editor.indent();\n      },\n      multiSelectAction: \"forEach\",\n      scrollIntoView: \"selectionPart\",\n    },\n    {\n      name: \"blockoutdent\",\n      description: \"Block outdent\",\n      bindKey: bindKey(\"Ctrl-[\", \"Ctrl-[\"),\n      exec: function (editor) {\n        editor.blockOutdent();\n      },\n      multiSelectAction: \"forEachLine\",\n      scrollIntoView: \"selectionPart\",\n    },\n    {\n      name: \"blockindent\",\n      description: \"Block indent\",\n      bindKey: bindKey(\"Ctrl-]\", \"Ctrl-]\"),\n      exec: function (editor) {\n        editor.blockIndent();\n      },\n      multiSelectAction: \"forEachLine\",\n      scrollIntoView: \"selectionPart\",\n    },\n    {\n      name: \"insertstring\",\n      description: \"Insert string\",\n      exec: function (editor, str) {\n        editor.insert(str);\n      },\n      multiSelectAction: \"forEach\",\n      scrollIntoView: \"cursor\",\n    },\n    {\n      name: \"inserttext\",\n      description: \"Insert text\",\n      exec: function (editor, args) {\n        editor.insert(lang.stringRepeat(args.text || \"\", args.times || 1));\n      },\n      multiSelectAction: \"forEach\",\n      scrollIntoView: \"cursor\",\n    },\n    {\n      name: \"splitline\",\n      description: \"Split line\",\n      bindKey: bindKey(null, \"Ctrl-O\"),\n      exec: function (editor) {\n        editor.splitLine();\n      },\n      multiSelectAction: \"forEach\",\n      scrollIntoView: \"cursor\",\n    },\n    {\n      name: \"transposeletters\",\n      description: \"Transpose letters\",\n      bindKey: bindKey(\"Alt-Shift-X\", \"Ctrl-T\"),\n      exec: function (editor) {\n        editor.transposeLetters();\n      },\n      multiSelectAction: function (editor) {\n        editor.transposeSelections(1);\n      },\n      scrollIntoView: \"cursor\",\n    },\n    {\n      name: \"touppercase\",\n      description: \"To uppercase\",\n      bindKey: bindKey(\"Ctrl-U\", \"Ctrl-U\"),\n      exec: function (editor) {\n        editor.toUpperCase();\n      },\n      multiSelectAction: \"forEach\",\n      scrollIntoView: \"cursor\",\n    },\n    {\n      name: \"tolowercase\",\n      description: \"To lowercase\",\n      bindKey: bindKey(\"Ctrl-Shift-U\", \"Ctrl-Shift-U\"),\n      exec: function (editor) {\n        editor.toLowerCase();\n      },\n      multiSelectAction: \"forEach\",\n      scrollIntoView: \"cursor\",\n    },\n    {\n      name: \"autoindent\",\n      description: \"Auto Indent\",\n      bindKey: bindKey(null, null),\n      exec: function (editor) {\n        editor.autoIndent();\n      },\n      multiSelectAction: \"forEachLine\",\n      scrollIntoView: \"animate\",\n    },\n    {\n      name: \"expandtoline\",\n      description: \"Expand to line\",\n      bindKey: bindKey(\"Ctrl-Shift-L\", \"Command-Shift-L\"),\n      exec: function (editor) {\n        var range = editor.selection.getRange();\n        range.start.column = range.end.column = 0;\n        range.end.row++;\n        editor.selection.setRange(range, false);\n      },\n      multiSelectAction: \"forEach\",\n      scrollIntoView: \"cursor\",\n      readOnly: true,\n    },\n    {\n      name: \"openlink\",\n      bindKey: bindKey(\"Ctrl+F3\", \"F3\"),\n      exec: function (editor) {\n        editor.openLink();\n      },\n    },\n    {\n      name: \"joinlines\",\n      description: \"Join lines\",\n      bindKey: bindKey(null, null),\n      exec: function (editor) {\n        var isBackwards = editor.selection.isBackwards();\n        var selectionStart = isBackwards\n          ? editor.selection.getSelectionLead()\n          : editor.selection.getSelectionAnchor();\n        var selectionEnd = isBackwards\n          ? editor.selection.getSelectionAnchor()\n          : editor.selection.getSelectionLead();\n        var firstLineEndCol = editor.session.doc.getLine(\n          selectionStart.row,\n        ).length;\n        var selectedText = editor.session.doc.getTextRange(\n          editor.selection.getRange(),\n        );\n        var selectedCount = selectedText.replace(/\\n\\s*/, \" \").length;\n        var insertLine = editor.session.doc.getLine(selectionStart.row);\n        for (var i = selectionStart.row + 1; i <= selectionEnd.row + 1; i++) {\n          var curLine = lang.stringTrimLeft(\n            lang.stringTrimRight(editor.session.doc.getLine(i)),\n          );\n          if (curLine.length !== 0) {\n            curLine = \" \" + curLine;\n          }\n          insertLine += curLine;\n        }\n        if (selectionEnd.row + 1 < editor.session.doc.getLength() - 1) {\n          insertLine += editor.session.doc.getNewLineCharacter();\n        }\n        editor.clearSelection();\n        editor.session.doc.replace(\n          new Range(selectionStart.row, 0, selectionEnd.row + 2, 0),\n          insertLine,\n        );\n        if (selectedCount > 0) {\n          editor.selection.moveCursorTo(\n            selectionStart.row,\n            selectionStart.column,\n          );\n          editor.selection.selectTo(\n            selectionStart.row,\n            selectionStart.column + selectedCount,\n          );\n        } else {\n          firstLineEndCol =\n            editor.session.doc.getLine(selectionStart.row).length >\n            firstLineEndCol\n              ? firstLineEndCol + 1\n              : firstLineEndCol;\n          editor.selection.moveCursorTo(selectionStart.row, firstLineEndCol);\n        }\n      },\n      multiSelectAction: \"forEach\",\n      readOnly: true,\n    },\n    {\n      name: \"invertSelection\",\n      description: \"Invert selection\",\n      bindKey: bindKey(null, null),\n      exec: function (editor) {\n        var endRow = editor.session.doc.getLength() - 1;\n        var endCol = editor.session.doc.getLine(endRow).length;\n        var ranges = editor.selection.rangeList.ranges;\n        var newRanges = [];\n        if (ranges.length < 1) {\n          ranges = [editor.selection.getRange()];\n        }\n        for (var i = 0; i < ranges.length; i++) {\n          if (i == ranges.length - 1) {\n            if (\n              !(ranges[i].end.row === endRow && ranges[i].end.column === endCol)\n            ) {\n              newRanges.push(\n                new Range(\n                  ranges[i].end.row,\n                  ranges[i].end.column,\n                  endRow,\n                  endCol,\n                ),\n              );\n            }\n          }\n          if (i === 0) {\n            if (!(ranges[i].start.row === 0 && ranges[i].start.column === 0)) {\n              newRanges.push(\n                new Range(0, 0, ranges[i].start.row, ranges[i].start.column),\n              );\n            }\n          } else {\n            newRanges.push(\n              new Range(\n                ranges[i - 1].end.row,\n                ranges[i - 1].end.column,\n                ranges[i].start.row,\n                ranges[i].start.column,\n              ),\n            );\n          }\n        }\n        editor.exitMultiSelectMode();\n        editor.clearSelection();\n        for (var i = 0; i < newRanges.length; i++) {\n          editor.selection.addRange(newRanges[i], false);\n        }\n      },\n      readOnly: true,\n      scrollIntoView: \"none\",\n    },\n    {\n      name: \"addLineAfter\",\n      description: \"Add new line after the current line\",\n      exec: function (editor) {\n        editor.selection.clearSelection();\n        editor.navigateLineEnd();\n        editor.insert(\"\\n\");\n      },\n      multiSelectAction: \"forEach\",\n      scrollIntoView: \"cursor\",\n    },\n    {\n      name: \"addLineBefore\",\n      description: \"Add new line before the current line\",\n      exec: function (editor) {\n        editor.selection.clearSelection();\n        var cursor = editor.getCursorPosition();\n        editor.selection.moveTo(cursor.row - 1, Number.MAX_VALUE);\n        editor.insert(\"\\n\");\n        if (cursor.row === 0) editor.navigateUp();\n      },\n      multiSelectAction: \"forEach\",\n      scrollIntoView: \"cursor\",\n    },\n    {\n      name: \"openCommandPallete\",\n      exec: function (editor) {\n        console.warn(\n          \"This is an obsolete command. Please use `openCommandPalette` instead.\",\n        );\n        editor.prompt({ $type: \"commands\" });\n      },\n      readOnly: true,\n    },\n    {\n      name: \"openCommandPalette\",\n      description: \"Open command palette\",\n      bindKey: bindKey(\"F1\", \"F1\"),\n      exec: function (editor) {\n        editor.prompt({ $type: \"commands\" });\n      },\n      readOnly: true,\n    },\n    {\n      name: \"modeSelect\",\n      description: \"Change language mode...\",\n      bindKey: bindKey(null, null),\n      exec: function (editor) {\n        editor.prompt({ $type: \"modes\" });\n      },\n      readOnly: true,\n    },\n  ];\n  for (var i = 1; i < 9; i++) {\n    exports.commands.push({\n      name: \"foldToLevel\" + i,\n      description: \"Fold To Level \" + i,\n      level: i,\n      exec: function (editor) {\n        editor.session.foldToLevel(this.level);\n      },\n      scrollIntoView: \"center\",\n      readOnly: true,\n    });\n  }\n});\n\ndefine(\"ace/line_widgets\", [\n  \"require\",\n  \"exports\",\n  \"module\",\n  \"ace/lib/dom\",\n], function (require, exports, module) {\n  \"use strict\";\n  var dom = require(\"./lib/dom\");\n  var LineWidgets = /** @class */ (function () {\n    function LineWidgets(session) {\n      this.session = session;\n      this.session.widgetManager = this;\n      this.session.getRowLength = this.getRowLength;\n      this.session.$getWidgetScreenLength = this.$getWidgetScreenLength;\n      this.updateOnChange = this.updateOnChange.bind(this);\n      this.renderWidgets = this.renderWidgets.bind(this);\n      this.measureWidgets = this.measureWidgets.bind(this);\n      this.session._changedWidgets = [];\n      this.$onChangeEditor = this.$onChangeEditor.bind(this);\n      this.session.on(\"change\", this.updateOnChange);\n      this.session.on(\"changeFold\", this.updateOnFold);\n      this.session.on(\"changeEditor\", this.$onChangeEditor);\n    }\n    LineWidgets.prototype.getRowLength = function (row) {\n      var h;\n      if (this.lineWidgets)\n        h = (this.lineWidgets[row] && this.lineWidgets[row].rowCount) || 0;\n      else h = 0;\n      if (!this[\"$useWrapMode\"] || !this[\"$wrapData\"][row]) {\n        return 1 + h;\n      } else {\n        return this[\"$wrapData\"][row].length + 1 + h;\n      }\n    };\n    LineWidgets.prototype.$getWidgetScreenLength = function () {\n      var screenRows = 0;\n      this.lineWidgets.forEach(function (w) {\n        if (w && w.rowCount && !w.hidden) screenRows += w.rowCount;\n      });\n      return screenRows;\n    };\n    LineWidgets.prototype.$onChangeEditor = function (e) {\n      this.attach(e.editor);\n    };\n    LineWidgets.prototype.attach = function (editor) {\n      if (editor && editor.widgetManager && editor.widgetManager != this)\n        editor.widgetManager.detach();\n      if (this.editor == editor) return;\n      this.detach();\n      this.editor = editor;\n      if (editor) {\n        editor.widgetManager = this;\n        editor.renderer.on(\"beforeRender\", this.measureWidgets);\n        editor.renderer.on(\"afterRender\", this.renderWidgets);\n      }\n    };\n    LineWidgets.prototype.detach = function (e) {\n      var editor = this.editor;\n      if (!editor) return;\n      this.editor = null;\n      editor.widgetManager = null;\n      editor.renderer.off(\"beforeRender\", this.measureWidgets);\n      editor.renderer.off(\"afterRender\", this.renderWidgets);\n      var lineWidgets = this.session.lineWidgets;\n      lineWidgets &&\n        lineWidgets.forEach(function (w) {\n          if (w && w.el && w.el.parentNode) {\n            w._inDocument = false;\n            w.el.parentNode.removeChild(w.el);\n          }\n        });\n    };\n    LineWidgets.prototype.updateOnFold = function (e, session) {\n      var lineWidgets = session.lineWidgets;\n      if (!lineWidgets || !e.action) return;\n      var fold = e.data;\n      var start = fold.start.row;\n      var end = fold.end.row;\n      var hide = e.action == \"add\";\n      for (var i = start + 1; i < end; i++) {\n        if (lineWidgets[i]) lineWidgets[i].hidden = hide;\n      }\n      if (lineWidgets[end]) {\n        if (hide) {\n          if (!lineWidgets[start]) lineWidgets[start] = lineWidgets[end];\n          else lineWidgets[end].hidden = hide;\n        } else {\n          if (lineWidgets[start] == lineWidgets[end])\n            lineWidgets[start] = undefined;\n          lineWidgets[end].hidden = hide;\n        }\n      }\n    };\n    LineWidgets.prototype.updateOnChange = function (delta) {\n      var lineWidgets = this.session.lineWidgets;\n      if (!lineWidgets) return;\n      var startRow = delta.start.row;\n      var len = delta.end.row - startRow;\n      if (len === 0) {\n      } else if (delta.action == \"remove\") {\n        var removed = lineWidgets.splice(startRow + 1, len);\n        if (!lineWidgets[startRow] && removed[removed.length - 1]) {\n          lineWidgets[startRow] = removed.pop();\n        }\n        removed.forEach(function (w) {\n          w && this.removeLineWidget(w);\n        }, this);\n        this.$updateRows();\n      } else {\n        var args = new Array(len);\n        if (lineWidgets[startRow] && lineWidgets[startRow].column != null) {\n          if (delta.start.column > lineWidgets[startRow].column) startRow++;\n        }\n        args.unshift(startRow, 0);\n        lineWidgets.splice.apply(lineWidgets, args);\n        this.$updateRows();\n      }\n    };\n    LineWidgets.prototype.$updateRows = function () {\n      var lineWidgets = this.session.lineWidgets;\n      if (!lineWidgets) return;\n      var noWidgets = true;\n      lineWidgets.forEach(function (w, i) {\n        if (w) {\n          noWidgets = false;\n          w.row = i;\n          while (w.$oldWidget) {\n            w.$oldWidget.row = i;\n            w = w.$oldWidget;\n          }\n        }\n      });\n      if (noWidgets) this.session.lineWidgets = null;\n    };\n    LineWidgets.prototype.$registerLineWidget = function (w) {\n      if (!this.session.lineWidgets)\n        this.session.lineWidgets = new Array(this.session.getLength());\n      var old = this.session.lineWidgets[w.row];\n      if (old) {\n        w.$oldWidget = old;\n        if (old.el && old.el.parentNode) {\n          old.el.parentNode.removeChild(old.el);\n          old._inDocument = false;\n        }\n      }\n      this.session.lineWidgets[w.row] = w;\n      return w;\n    };\n    LineWidgets.prototype.addLineWidget = function (w) {\n      this.$registerLineWidget(w);\n      w.session = this.session;\n      if (!this.editor) return w;\n      var renderer = this.editor.renderer;\n      if (w.html && !w.el) {\n        w.el = dom.createElement(\"div\");\n        w.el.innerHTML = w.html;\n      }\n      if (w.text && !w.el) {\n        w.el = dom.createElement(\"div\");\n        w.el.textContent = w.text;\n      }\n      if (w.el) {\n        dom.addCssClass(w.el, \"ace_lineWidgetContainer\");\n        if (w.className) {\n          dom.addCssClass(w.el, w.className);\n        }\n        w.el.style.position = \"absolute\";\n        w.el.style.zIndex = \"5\";\n        renderer.container.appendChild(w.el);\n        w._inDocument = true;\n        if (!w.coverGutter) {\n          w.el.style.zIndex = \"3\";\n        }\n        if (w.pixelHeight == null) {\n          w.pixelHeight = w.el.offsetHeight;\n        }\n      }\n      if (w.rowCount == null) {\n        w.rowCount = w.pixelHeight / renderer.layerConfig.lineHeight;\n      }\n      var fold = this.session.getFoldAt(w.row, 0);\n      w.$fold = fold;\n      if (fold) {\n        var lineWidgets = this.session.lineWidgets;\n        if (w.row == fold.end.row && !lineWidgets[fold.start.row])\n          lineWidgets[fold.start.row] = w;\n        else w.hidden = true;\n      }\n      this.session._emit(\"changeFold\", { data: { start: { row: w.row } } });\n      this.$updateRows();\n      this.renderWidgets(null, renderer);\n      this.onWidgetChanged(w);\n      return w;\n    };\n    LineWidgets.prototype.removeLineWidget = function (w) {\n      w._inDocument = false;\n      w.session = null;\n      if (w.el && w.el.parentNode) w.el.parentNode.removeChild(w.el);\n      if (w.editor && w.editor.destroy)\n        try {\n          w.editor.destroy();\n        } catch (e) {}\n      if (this.session.lineWidgets) {\n        var w1 = this.session.lineWidgets[w.row];\n        if (w1 == w) {\n          this.session.lineWidgets[w.row] = w.$oldWidget;\n          if (w.$oldWidget) this.onWidgetChanged(w.$oldWidget);\n        } else {\n          while (w1) {\n            if (w1.$oldWidget == w) {\n              w1.$oldWidget = w.$oldWidget;\n              break;\n            }\n            w1 = w1.$oldWidget;\n          }\n        }\n      }\n      this.session._emit(\"changeFold\", { data: { start: { row: w.row } } });\n      this.$updateRows();\n    };\n    LineWidgets.prototype.getWidgetsAtRow = function (row) {\n      var lineWidgets = this.session.lineWidgets;\n      var w = lineWidgets && lineWidgets[row];\n      var list = [];\n      while (w) {\n        list.push(w);\n        w = w.$oldWidget;\n      }\n      return list;\n    };\n    LineWidgets.prototype.onWidgetChanged = function (w) {\n      this.session._changedWidgets.push(w);\n      this.editor && this.editor.renderer.updateFull();\n    };\n    LineWidgets.prototype.measureWidgets = function (e, renderer) {\n      var changedWidgets = this.session._changedWidgets;\n      var config = renderer.layerConfig;\n      if (!changedWidgets || !changedWidgets.length) return;\n      var min = Infinity;\n      for (var i = 0; i < changedWidgets.length; i++) {\n        var w = changedWidgets[i];\n        if (!w || !w.el) continue;\n        if (w.session != this.session) continue;\n        if (!w._inDocument) {\n          if (this.session.lineWidgets[w.row] != w) continue;\n          w._inDocument = true;\n          renderer.container.appendChild(w.el);\n        }\n        w.h = w.el.offsetHeight;\n        if (!w.fixedWidth) {\n          w.w = w.el.offsetWidth;\n          w.screenWidth = Math.ceil(w.w / config.characterWidth);\n        }\n        var rowCount = w.h / config.lineHeight;\n        if (w.coverLine) {\n          rowCount -= this.session.getRowLineCount(w.row);\n          if (rowCount < 0) rowCount = 0;\n        }\n        if (w.rowCount != rowCount) {\n          w.rowCount = rowCount;\n          if (w.row < min) min = w.row;\n        }\n      }\n      if (min != Infinity) {\n        this.session._emit(\"changeFold\", { data: { start: { row: min } } });\n        this.session.lineWidgetWidth = null;\n      }\n      this.session._changedWidgets = [];\n    };\n    LineWidgets.prototype.renderWidgets = function (e, renderer) {\n      var config = renderer.layerConfig;\n      var lineWidgets = this.session.lineWidgets;\n      if (!lineWidgets) return;\n      var first = Math.min(this.firstRow, config.firstRow);\n      var last = Math.max(this.lastRow, config.lastRow, lineWidgets.length);\n      while (first > 0 && !lineWidgets[first]) first--;\n      this.firstRow = config.firstRow;\n      this.lastRow = config.lastRow;\n      renderer.$cursorLayer.config = config;\n      for (var i = first; i <= last; i++) {\n        var w = lineWidgets[i];\n        if (!w || !w.el) continue;\n        if (w.hidden) {\n          w.el.style.top = -100 - (w.pixelHeight || 0) + \"px\";\n          continue;\n        }\n        if (!w._inDocument) {\n          w._inDocument = true;\n          renderer.container.appendChild(w.el);\n        }\n        var top = renderer.$cursorLayer.getPixelPosition(\n          { row: i, column: 0 },\n          true,\n        ).top;\n        if (!w.coverLine)\n          top += config.lineHeight * this.session.getRowLineCount(w.row);\n        w.el.style.top = top - config.offset + \"px\";\n        var left = w.coverGutter ? 0 : renderer.gutterWidth;\n        if (!w.fixedWidth) left -= renderer.scrollLeft;\n        w.el.style.left = left + \"px\";\n        if (w.fullWidth && w.screenWidth) {\n          w.el.style.minWidth = config.width + 2 * config.padding + \"px\";\n        }\n        if (w.fixedWidth) {\n          w.el.style.right = renderer.scrollBar.getWidth() + \"px\";\n        } else {\n          w.el.style.right = \"\";\n        }\n      }\n    };\n    return LineWidgets;\n  })();\n  exports.LineWidgets = LineWidgets;\n});\n\ndefine(\"ace/keyboard/gutter_handler\", [\n  \"require\",\n  \"exports\",\n  \"module\",\n  \"ace/lib/keys\",\n  \"ace/mouse/default_gutter_handler\",\n], function (require, exports, module) {\n  \"use strict\";\n  var keys = require(\"../lib/keys\");\n  var GutterTooltip = require(\"../mouse/default_gutter_handler\").GutterTooltip;\n  var GutterKeyboardHandler = /** @class */ (function () {\n    function GutterKeyboardHandler(editor) {\n      this.editor = editor;\n      this.gutterLayer = editor.renderer.$gutterLayer;\n      this.element = editor.renderer.$gutter;\n      this.lines = editor.renderer.$gutterLayer.$lines;\n      this.activeRowIndex = null;\n      this.activeLane = null;\n      this.annotationTooltip = new GutterTooltip(this.editor);\n    }\n    GutterKeyboardHandler.prototype.addListener = function () {\n      this.element.addEventListener(\n        \"keydown\",\n        this.$onGutterKeyDown.bind(this),\n      );\n      this.element.addEventListener(\"focusout\", this.$blurGutter.bind(this));\n      this.editor.on(\"mousewheel\", this.$blurGutter.bind(this));\n    };\n    GutterKeyboardHandler.prototype.removeListener = function () {\n      this.element.removeEventListener(\n        \"keydown\",\n        this.$onGutterKeyDown.bind(this),\n      );\n      this.element.removeEventListener(\"focusout\", this.$blurGutter.bind(this));\n      this.editor.off(\"mousewheel\", this.$blurGutter.bind(this));\n    };\n    GutterKeyboardHandler.prototype.$onGutterKeyDown = function (e) {\n      if (this.annotationTooltip.isOpen) {\n        e.preventDefault();\n        if (e.keyCode === keys[\"escape\"]) this.annotationTooltip.hideTooltip();\n        return;\n      }\n      if (e.target === this.element) {\n        if (e.keyCode != keys[\"enter\"]) {\n          return;\n        }\n        e.preventDefault();\n        var row = this.editor.getCursorPosition().row;\n        if (!this.editor.isRowVisible(row))\n          this.editor.scrollToLine(row, true, true);\n        setTimeout(\n          function () {\n            var index = this.$rowToRowIndex(this.gutterLayer.$cursorCell.row);\n            var nearestFoldIndex = this.$findNearestFoldWidget(index);\n            var nearestAnnotationIndex = this.$findNearestAnnotation(index);\n            if (nearestFoldIndex === null && nearestAnnotationIndex === null)\n              return;\n            if (nearestFoldIndex === null && nearestAnnotationIndex !== null) {\n              this.activeRowIndex = nearestAnnotationIndex;\n              this.activeLane = \"annotation\";\n              this.$focusAnnotation(this.activeRowIndex);\n              return;\n            }\n            if (nearestFoldIndex !== null && nearestAnnotationIndex === null) {\n              this.activeRowIndex = nearestFoldIndex;\n              this.activeLane = \"fold\";\n              this.$focusFoldWidget(this.activeRowIndex);\n              return;\n            }\n            if (\n              Math.abs(nearestAnnotationIndex - index) <\n              Math.abs(nearestFoldIndex - index)\n            ) {\n              this.activeRowIndex = nearestAnnotationIndex;\n              this.activeLane = \"annotation\";\n              this.$focusAnnotation(this.activeRowIndex);\n              return;\n            } else {\n              this.activeRowIndex = nearestFoldIndex;\n              this.activeLane = \"fold\";\n              this.$focusFoldWidget(this.activeRowIndex);\n              return;\n            }\n          }.bind(this),\n          10,\n        );\n        return;\n      }\n      this.$handleGutterKeyboardInteraction(e);\n      setTimeout(\n        function () {\n          this.editor._signal(\n            \"gutterkeydown\",\n            new GutterKeyboardEvent(e, this),\n          );\n        }.bind(this),\n        10,\n      );\n    };\n    GutterKeyboardHandler.prototype.$handleGutterKeyboardInteraction =\n      function (e) {\n        if (e.keyCode === keys[\"tab\"]) {\n          e.preventDefault();\n          return;\n        }\n        if (e.keyCode === keys[\"escape\"]) {\n          e.preventDefault();\n          this.$blurGutter();\n          this.element.focus();\n          this.lane = null;\n          return;\n        }\n        if (e.keyCode === keys[\"up\"]) {\n          e.preventDefault();\n          switch (this.activeLane) {\n            case \"fold\":\n              this.$moveFoldWidgetUp();\n              break;\n            case \"annotation\":\n              this.$moveAnnotationUp();\n              break;\n          }\n          return;\n        }\n        if (e.keyCode === keys[\"down\"]) {\n          e.preventDefault();\n          switch (this.activeLane) {\n            case \"fold\":\n              this.$moveFoldWidgetDown();\n              break;\n            case \"annotation\":\n              this.$moveAnnotationDown();\n              break;\n          }\n          return;\n        }\n        if (e.keyCode === keys[\"left\"]) {\n          e.preventDefault();\n          this.$switchLane(\"annotation\");\n          return;\n        }\n        if (e.keyCode === keys[\"right\"]) {\n          e.preventDefault();\n          this.$switchLane(\"fold\");\n          return;\n        }\n        if (e.keyCode === keys[\"enter\"] || e.keyCode === keys[\"space\"]) {\n          e.preventDefault();\n          switch (this.activeLane) {\n            case \"fold\":\n              if (\n                this.gutterLayer.session.foldWidgets[\n                  this.$rowIndexToRow(this.activeRowIndex)\n                ] === \"start\"\n              ) {\n                var rowFoldingWidget = this.$rowIndexToRow(this.activeRowIndex);\n                this.editor.session.onFoldWidgetClick(\n                  this.$rowIndexToRow(this.activeRowIndex),\n                  e,\n                );\n                setTimeout(\n                  function () {\n                    if (\n                      this.$rowIndexToRow(this.activeRowIndex) !==\n                      rowFoldingWidget\n                    ) {\n                      this.$blurFoldWidget(this.activeRowIndex);\n                      this.activeRowIndex =\n                        this.$rowToRowIndex(rowFoldingWidget);\n                      this.$focusFoldWidget(this.activeRowIndex);\n                    }\n                  }.bind(this),\n                  10,\n                );\n                break;\n              } else if (\n                this.gutterLayer.session.foldWidgets[\n                  this.$rowIndexToRow(this.activeRowIndex)\n                ] === \"end\"\n              ) {\n                break;\n              }\n              return;\n            case \"annotation\":\n              var gutterElement =\n                this.lines.cells[this.activeRowIndex].element.childNodes[2];\n              var rect = gutterElement.getBoundingClientRect();\n              var style = this.annotationTooltip.getElement().style;\n              style.left = rect.right + \"px\";\n              style.top = rect.bottom + \"px\";\n              this.annotationTooltip.showTooltip(\n                this.$rowIndexToRow(this.activeRowIndex),\n              );\n              break;\n          }\n          return;\n        }\n      };\n    GutterKeyboardHandler.prototype.$blurGutter = function () {\n      if (this.activeRowIndex !== null) {\n        switch (this.activeLane) {\n          case \"fold\":\n            this.$blurFoldWidget(this.activeRowIndex);\n            break;\n          case \"annotation\":\n            this.$blurAnnotation(this.activeRowIndex);\n            break;\n        }\n      }\n      if (this.annotationTooltip.isOpen) this.annotationTooltip.hideTooltip();\n      return;\n    };\n    GutterKeyboardHandler.prototype.$isFoldWidgetVisible = function (index) {\n      var isRowFullyVisible = this.editor.isRowFullyVisible(\n        this.$rowIndexToRow(index),\n      );\n      var isIconVisible = this.$getFoldWidget(index).style.display !== \"none\";\n      return isRowFullyVisible && isIconVisible;\n    };\n    GutterKeyboardHandler.prototype.$isAnnotationVisible = function (index) {\n      var isRowFullyVisible = this.editor.isRowFullyVisible(\n        this.$rowIndexToRow(index),\n      );\n      var isIconVisible = this.$getAnnotation(index).style.display !== \"none\";\n      return isRowFullyVisible && isIconVisible;\n    };\n    GutterKeyboardHandler.prototype.$getFoldWidget = function (index) {\n      var cell = this.lines.get(index);\n      var element = cell.element;\n      return element.childNodes[1];\n    };\n    GutterKeyboardHandler.prototype.$getAnnotation = function (index) {\n      var cell = this.lines.get(index);\n      var element = cell.element;\n      return element.childNodes[2];\n    };\n    GutterKeyboardHandler.prototype.$findNearestFoldWidget = function (index) {\n      if (this.$isFoldWidgetVisible(index)) return index;\n      var i = 0;\n      while (index - i > 0 || index + i < this.lines.getLength() - 1) {\n        i++;\n        if (index - i >= 0 && this.$isFoldWidgetVisible(index - i))\n          return index - i;\n        if (\n          index + i <= this.lines.getLength() - 1 &&\n          this.$isFoldWidgetVisible(index + i)\n        )\n          return index + i;\n      }\n      return null;\n    };\n    GutterKeyboardHandler.prototype.$findNearestAnnotation = function (index) {\n      if (this.$isAnnotationVisible(index)) return index;\n      var i = 0;\n      while (index - i > 0 || index + i < this.lines.getLength() - 1) {\n        i++;\n        if (index - i >= 0 && this.$isAnnotationVisible(index - i))\n          return index - i;\n        if (\n          index + i <= this.lines.getLength() - 1 &&\n          this.$isAnnotationVisible(index + i)\n        )\n          return index + i;\n      }\n      return null;\n    };\n    GutterKeyboardHandler.prototype.$focusFoldWidget = function (index) {\n      if (index == null) return;\n      var foldWidget = this.$getFoldWidget(index);\n      foldWidget.classList.add(this.editor.renderer.keyboardFocusClassName);\n      foldWidget.focus();\n    };\n    GutterKeyboardHandler.prototype.$focusAnnotation = function (index) {\n      if (index == null) return;\n      var annotation = this.$getAnnotation(index);\n      annotation.classList.add(this.editor.renderer.keyboardFocusClassName);\n      annotation.focus();\n    };\n    GutterKeyboardHandler.prototype.$blurFoldWidget = function (index) {\n      var foldWidget = this.$getFoldWidget(index);\n      foldWidget.classList.remove(this.editor.renderer.keyboardFocusClassName);\n      foldWidget.blur();\n    };\n    GutterKeyboardHandler.prototype.$blurAnnotation = function (index) {\n      var annotation = this.$getAnnotation(index);\n      annotation.classList.remove(this.editor.renderer.keyboardFocusClassName);\n      annotation.blur();\n    };\n    GutterKeyboardHandler.prototype.$moveFoldWidgetUp = function () {\n      var index = this.activeRowIndex;\n      while (index > 0) {\n        index--;\n        if (this.$isFoldWidgetVisible(index)) {\n          this.$blurFoldWidget(this.activeRowIndex);\n          this.activeRowIndex = index;\n          this.$focusFoldWidget(this.activeRowIndex);\n          return;\n        }\n      }\n      return;\n    };\n    GutterKeyboardHandler.prototype.$moveFoldWidgetDown = function () {\n      var index = this.activeRowIndex;\n      while (index < this.lines.getLength() - 1) {\n        index++;\n        if (this.$isFoldWidgetVisible(index)) {\n          this.$blurFoldWidget(this.activeRowIndex);\n          this.activeRowIndex = index;\n          this.$focusFoldWidget(this.activeRowIndex);\n          return;\n        }\n      }\n      return;\n    };\n    GutterKeyboardHandler.prototype.$moveAnnotationUp = function () {\n      var index = this.activeRowIndex;\n      while (index > 0) {\n        index--;\n        if (this.$isAnnotationVisible(index)) {\n          this.$blurAnnotation(this.activeRowIndex);\n          this.activeRowIndex = index;\n          this.$focusAnnotation(this.activeRowIndex);\n          return;\n        }\n      }\n      return;\n    };\n    GutterKeyboardHandler.prototype.$moveAnnotationDown = function () {\n      var index = this.activeRowIndex;\n      while (index < this.lines.getLength() - 1) {\n        index++;\n        if (this.$isAnnotationVisible(index)) {\n          this.$blurAnnotation(this.activeRowIndex);\n          this.activeRowIndex = index;\n          this.$focusAnnotation(this.activeRowIndex);\n          return;\n        }\n      }\n      return;\n    };\n    GutterKeyboardHandler.prototype.$switchLane = function (desinationLane) {\n      switch (desinationLane) {\n        case \"annotation\":\n          if (this.activeLane === \"annotation\") {\n            break;\n          }\n          var annotationIndex = this.$findNearestAnnotation(\n            this.activeRowIndex,\n          );\n          if (annotationIndex == null) {\n            break;\n          }\n          this.activeLane = \"annotation\";\n          this.$blurFoldWidget(this.activeRowIndex);\n          this.activeRowIndex = annotationIndex;\n          this.$focusAnnotation(this.activeRowIndex);\n          break;\n        case \"fold\":\n          if (this.activeLane === \"fold\") {\n            break;\n          }\n          var foldWidgetIndex = this.$findNearestFoldWidget(\n            this.activeRowIndex,\n          );\n          if (foldWidgetIndex == null) {\n            break;\n          }\n          this.activeLane = \"fold\";\n          this.$blurAnnotation(this.activeRowIndex);\n          this.activeRowIndex = foldWidgetIndex;\n          this.$focusFoldWidget(this.activeRowIndex);\n          break;\n      }\n      return;\n    };\n    GutterKeyboardHandler.prototype.$rowIndexToRow = function (index) {\n      var cell = this.lines.get(index);\n      if (cell) return cell.row;\n      return null;\n    };\n    GutterKeyboardHandler.prototype.$rowToRowIndex = function (row) {\n      for (var i = 0; i < this.lines.getLength(); i++) {\n        var cell = this.lines.get(i);\n        if (cell.row == row) return i;\n      }\n      return null;\n    };\n    return GutterKeyboardHandler;\n  })();\n  exports.GutterKeyboardHandler = GutterKeyboardHandler;\n  var GutterKeyboardEvent = /** @class */ (function () {\n    function GutterKeyboardEvent(domEvent, gutterKeyboardHandler) {\n      this.gutterKeyboardHandler = gutterKeyboardHandler;\n      this.domEvent = domEvent;\n    }\n    GutterKeyboardEvent.prototype.getKey = function () {\n      return keys.keyCodeToString(this.domEvent.keyCode);\n    };\n    GutterKeyboardEvent.prototype.getRow = function () {\n      return this.gutterKeyboardHandler.$rowIndexToRow(\n        this.gutterKeyboardHandler.activeRowIndex,\n      );\n    };\n    GutterKeyboardEvent.prototype.isInAnnotationLane = function () {\n      return this.gutterKeyboardHandler.activeLane === \"annotation\";\n    };\n    GutterKeyboardEvent.prototype.isInFoldLane = function () {\n      return this.gutterKeyboardHandler.activeLane === \"fold\";\n    };\n    return GutterKeyboardEvent;\n  })();\n  exports.GutterKeyboardEvent = GutterKeyboardEvent;\n});\n\ndefine(\"ace/editor\", [\n  \"require\",\n  \"exports\",\n  \"module\",\n  \"ace/lib/oop\",\n  \"ace/lib/dom\",\n  \"ace/lib/lang\",\n  \"ace/lib/useragent\",\n  \"ace/keyboard/textinput\",\n  \"ace/mouse/mouse_handler\",\n  \"ace/mouse/fold_handler\",\n  \"ace/keyboard/keybinding\",\n  \"ace/edit_session\",\n  \"ace/search\",\n  \"ace/range\",\n  \"ace/lib/event_emitter\",\n  \"ace/commands/command_manager\",\n  \"ace/commands/default_commands\",\n  \"ace/config\",\n  \"ace/token_iterator\",\n  \"ace/line_widgets\",\n  \"ace/keyboard/gutter_handler\",\n  \"ace/config\",\n  \"ace/clipboard\",\n  \"ace/lib/keys\",\n], function (require, exports, module) {\n  \"use strict\";\n  var __values =\n    (this && this.__values) ||\n    function (o) {\n      var s = typeof Symbol === \"function\" && Symbol.iterator,\n        m = s && o[s],\n        i = 0;\n      if (m) return m.call(o);\n      if (o && typeof o.length === \"number\")\n        return {\n          next: function () {\n            if (o && i >= o.length) o = void 0;\n            return { value: o && o[i++], done: !o };\n          },\n        };\n      throw new TypeError(\n        s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\",\n      );\n    };\n  var oop = require(\"./lib/oop\");\n  var dom = require(\"./lib/dom\");\n  var lang = require(\"./lib/lang\");\n  var useragent = require(\"./lib/useragent\");\n  var TextInput = require(\"./keyboard/textinput\").TextInput;\n  var MouseHandler = require(\"./mouse/mouse_handler\").MouseHandler;\n  var FoldHandler = require(\"./mouse/fold_handler\").FoldHandler;\n  var KeyBinding = require(\"./keyboard/keybinding\").KeyBinding;\n  var EditSession = require(\"./edit_session\").EditSession;\n  var Search = require(\"./search\").Search;\n  var Range = require(\"./range\").Range;\n  var EventEmitter = require(\"./lib/event_emitter\").EventEmitter;\n  var CommandManager = require(\"./commands/command_manager\").CommandManager;\n  var defaultCommands = require(\"./commands/default_commands\").commands;\n  var config = require(\"./config\");\n  var TokenIterator = require(\"./token_iterator\").TokenIterator;\n  var LineWidgets = require(\"./line_widgets\").LineWidgets;\n  var GutterKeyboardHandler =\n    require(\"./keyboard/gutter_handler\").GutterKeyboardHandler;\n  var nls = require(\"./config\").nls;\n  var clipboard = require(\"./clipboard\");\n  var keys = require(\"./lib/keys\");\n  var Editor = /** @class */ (function () {\n    function Editor(renderer, session, options) {\n      this.session;\n      this.$toDestroy = [];\n      var container = renderer.getContainerElement();\n      this.container = container;\n      this.renderer = renderer;\n      this.id = \"editor\" + ++Editor.$uid;\n      this.commands = new CommandManager(\n        useragent.isMac ? \"mac\" : \"win\",\n        defaultCommands,\n      );\n      if (typeof document == \"object\") {\n        this.textInput = new TextInput(renderer.getTextAreaContainer(), this);\n        this.renderer.textarea = this.textInput.getElement();\n        this.$mouseHandler = new MouseHandler(this);\n        new FoldHandler(this);\n      }\n      this.keyBinding = new KeyBinding(this);\n      this.$search = new Search().set({\n        wrap: true,\n      });\n      this.$historyTracker = this.$historyTracker.bind(this);\n      this.commands.on(\"exec\", this.$historyTracker);\n      this.$initOperationListeners();\n      this._$emitInputEvent = lang.delayedCall(\n        function () {\n          this._signal(\"input\", {});\n          if (this.session && !this.session.destroyed)\n            this.session.bgTokenizer.scheduleStart();\n        }.bind(this),\n      );\n      this.on(\"change\", function (_, _self) {\n        _self._$emitInputEvent.schedule(31);\n      });\n      this.setSession(\n        session || (options && options.session) || new EditSession(\"\"),\n      );\n      config.resetOptions(this);\n      if (options) this.setOptions(options);\n      config._signal(\"editor\", this);\n    }\n    Editor.prototype.$initOperationListeners = function () {\n      this.commands.on(\"exec\", this.startOperation.bind(this), true);\n      this.commands.on(\"afterExec\", this.endOperation.bind(this), true);\n      this.$opResetTimer = lang.delayedCall(this.endOperation.bind(this, true));\n      this.on(\n        \"change\",\n        function () {\n          if (!this.curOp) {\n            this.startOperation();\n            this.curOp.selectionBefore = this.$lastSel;\n          }\n          this.curOp.docChanged = true;\n        }.bind(this),\n        true,\n      );\n      this.on(\n        \"changeSelection\",\n        function () {\n          if (!this.curOp) {\n            this.startOperation();\n            this.curOp.selectionBefore = this.$lastSel;\n          }\n          this.curOp.selectionChanged = true;\n        }.bind(this),\n        true,\n      );\n    };\n    Editor.prototype.startOperation = function (commandEvent) {\n      if (this.curOp) {\n        if (!commandEvent || this.curOp.command) return;\n        this.prevOp = this.curOp;\n      }\n      if (!commandEvent) {\n        this.previousCommand = null;\n        commandEvent = {};\n      }\n      this.$opResetTimer.schedule();\n      this.curOp = this.session.curOp = {\n        command: commandEvent.command || {},\n        args: commandEvent.args,\n        scrollTop: this.renderer.scrollTop,\n      };\n      this.curOp.selectionBefore = this.selection.toJSON();\n    };\n    Editor.prototype.endOperation = function (e) {\n      if (this.curOp && this.session) {\n        if ((e && e.returnValue === false) || !this.session)\n          return (this.curOp = null);\n        if (\n          e == true &&\n          this.curOp.command &&\n          this.curOp.command.name == \"mouse\"\n        )\n          return;\n        this._signal(\"beforeEndOperation\");\n        if (!this.curOp) return;\n        var command = this.curOp.command;\n        var scrollIntoView = command && command.scrollIntoView;\n        if (scrollIntoView) {\n          switch (scrollIntoView) {\n            case \"center-animate\":\n              scrollIntoView = \"animate\";\n            case \"center\":\n              this.renderer.scrollCursorIntoView(null, 0.5);\n              break;\n            case \"animate\":\n            case \"cursor\":\n              this.renderer.scrollCursorIntoView();\n              break;\n            case \"selectionPart\":\n              var range = this.selection.getRange();\n              var config = this.renderer.layerConfig;\n              if (\n                range.start.row >= config.lastRow ||\n                range.end.row <= config.firstRow\n              ) {\n                this.renderer.scrollSelectionIntoView(\n                  this.selection.anchor,\n                  this.selection.lead,\n                );\n              }\n              break;\n            default:\n              break;\n          }\n          if (scrollIntoView == \"animate\")\n            this.renderer.animateScrolling(this.curOp.scrollTop);\n        }\n        var sel = this.selection.toJSON();\n        this.curOp.selectionAfter = sel;\n        this.$lastSel = this.selection.toJSON();\n        this.session.getUndoManager().addSelection(sel);\n        this.prevOp = this.curOp;\n        this.curOp = null;\n      }\n    };\n    Editor.prototype.$historyTracker = function (e) {\n      if (!this.$mergeUndoDeltas) return;\n      var prev = this.prevOp;\n      var mergeableCommands = this.$mergeableCommands;\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) this.mergeNextCommand = true;\n        shouldMerge =\n          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        this.mergeNextCommand = true;\n      } else {\n        shouldMerge =\n          shouldMerge && mergeableCommands.indexOf(e.command.name) !== -1; // the command is mergeable\n      }\n      if (\n        this.$mergeUndoDeltas != \"always\" &&\n        Date.now() - this.sequenceStartTime > 2000\n      ) {\n        shouldMerge = false; // the sequence is too long\n      }\n      if (shouldMerge) this.session.mergeUndoDeltas = true;\n      else if (mergeableCommands.indexOf(e.command.name) !== -1)\n        this.sequenceStartTime = Date.now();\n    };\n    Editor.prototype.setKeyboardHandler = function (keyboardHandler, cb) {\n      if (\n        keyboardHandler &&\n        typeof keyboardHandler === \"string\" &&\n        keyboardHandler != \"ace\"\n      ) {\n        this.$keybindingId = keyboardHandler;\n        var _self = this;\n        config.loadModule([\"keybinding\", keyboardHandler], function (module) {\n          if (_self.$keybindingId == keyboardHandler)\n            _self.keyBinding.setKeyboardHandler(module && module.handler);\n          cb && cb();\n        });\n      } else {\n        this.$keybindingId = null;\n        this.keyBinding.setKeyboardHandler(keyboardHandler);\n        cb && cb();\n      }\n    };\n    Editor.prototype.getKeyboardHandler = function () {\n      return this.keyBinding.getKeyboardHandler();\n    };\n    Editor.prototype.setSession = function (session) {\n      if (this.session == session) return;\n      if (this.curOp) this.endOperation();\n      this.curOp = {};\n      var oldSession = this.session;\n      if (oldSession) {\n        this.session.off(\"change\", this.$onDocumentChange);\n        this.session.off(\"changeMode\", this.$onChangeMode);\n        this.session.off(\"tokenizerUpdate\", this.$onTokenizerUpdate);\n        this.session.off(\"changeTabSize\", this.$onChangeTabSize);\n        this.session.off(\"changeWrapLimit\", this.$onChangeWrapLimit);\n        this.session.off(\"changeWrapMode\", this.$onChangeWrapMode);\n        this.session.off(\"changeFold\", this.$onChangeFold);\n        this.session.off(\"changeFrontMarker\", this.$onChangeFrontMarker);\n        this.session.off(\"changeBackMarker\", this.$onChangeBackMarker);\n        this.session.off(\"changeBreakpoint\", this.$onChangeBreakpoint);\n        this.session.off(\"changeAnnotation\", this.$onChangeAnnotation);\n        this.session.off(\"changeOverwrite\", this.$onCursorChange);\n        this.session.off(\"changeScrollTop\", this.$onScrollTopChange);\n        this.session.off(\"changeScrollLeft\", this.$onScrollLeftChange);\n        var selection = this.session.getSelection();\n        selection.off(\"changeCursor\", this.$onCursorChange);\n        selection.off(\"changeSelection\", this.$onSelectionChange);\n      }\n      this.session = session;\n      if (session) {\n        this.$onDocumentChange = this.onDocumentChange.bind(this);\n        session.on(\"change\", this.$onDocumentChange);\n        this.renderer.setSession(session);\n        this.$onChangeMode = this.onChangeMode.bind(this);\n        session.on(\"changeMode\", this.$onChangeMode);\n        this.$onTokenizerUpdate = this.onTokenizerUpdate.bind(this);\n        session.on(\"tokenizerUpdate\", this.$onTokenizerUpdate);\n        this.$onChangeTabSize = this.renderer.onChangeTabSize.bind(\n          this.renderer,\n        );\n        session.on(\"changeTabSize\", this.$onChangeTabSize);\n        this.$onChangeWrapLimit = this.onChangeWrapLimit.bind(this);\n        session.on(\"changeWrapLimit\", this.$onChangeWrapLimit);\n        this.$onChangeWrapMode = this.onChangeWrapMode.bind(this);\n        session.on(\"changeWrapMode\", this.$onChangeWrapMode);\n        this.$onChangeFold = this.onChangeFold.bind(this);\n        session.on(\"changeFold\", this.$onChangeFold);\n        this.$onChangeFrontMarker = this.onChangeFrontMarker.bind(this);\n        this.session.on(\"changeFrontMarker\", this.$onChangeFrontMarker);\n        this.$onChangeBackMarker = this.onChangeBackMarker.bind(this);\n        this.session.on(\"changeBackMarker\", this.$onChangeBackMarker);\n        this.$onChangeBreakpoint = this.onChangeBreakpoint.bind(this);\n        this.session.on(\"changeBreakpoint\", this.$onChangeBreakpoint);\n        this.$onChangeAnnotation = this.onChangeAnnotation.bind(this);\n        this.session.on(\"changeAnnotation\", this.$onChangeAnnotation);\n        this.$onCursorChange = this.onCursorChange.bind(this);\n        this.session.on(\"changeOverwrite\", this.$onCursorChange);\n        this.$onScrollTopChange = this.onScrollTopChange.bind(this);\n        this.session.on(\"changeScrollTop\", this.$onScrollTopChange);\n        this.$onScrollLeftChange = this.onScrollLeftChange.bind(this);\n        this.session.on(\"changeScrollLeft\", this.$onScrollLeftChange);\n        this.selection = session.getSelection();\n        this.selection.on(\"changeCursor\", this.$onCursorChange);\n        this.$onSelectionChange = this.onSelectionChange.bind(this);\n        this.selection.on(\"changeSelection\", this.$onSelectionChange);\n        this.onChangeMode();\n        this.onCursorChange();\n        this.onScrollTopChange();\n        this.onScrollLeftChange();\n        this.onSelectionChange();\n        this.onChangeFrontMarker();\n        this.onChangeBackMarker();\n        this.onChangeBreakpoint();\n        this.onChangeAnnotation();\n        this.session.getUseWrapMode() && this.renderer.adjustWrapLimit();\n        this.renderer.updateFull();\n      } else {\n        this.selection = null;\n        this.renderer.setSession(session);\n      }\n      this._signal(\"changeSession\", {\n        session: session,\n        oldSession: oldSession,\n      });\n      this.curOp = null;\n      oldSession && oldSession._signal(\"changeEditor\", { oldEditor: this });\n      session && session._signal(\"changeEditor\", { editor: this });\n      if (session && !session.destroyed) session.bgTokenizer.scheduleStart();\n    };\n    Editor.prototype.getSession = function () {\n      return this.session;\n    };\n    Editor.prototype.setValue = function (val, cursorPos) {\n      this.session.doc.setValue(val);\n      if (!cursorPos) this.selectAll();\n      else if (cursorPos == 1) this.navigateFileEnd();\n      else if (cursorPos == -1) this.navigateFileStart();\n      return val;\n    };\n    Editor.prototype.getValue = function () {\n      return this.session.getValue();\n    };\n    Editor.prototype.getSelection = function () {\n      return this.selection;\n    };\n    Editor.prototype.resize = function (force) {\n      this.renderer.onResize(force);\n    };\n    Editor.prototype.setTheme = function (theme, cb) {\n      this.renderer.setTheme(theme, cb);\n    };\n    Editor.prototype.getTheme = function () {\n      return this.renderer.getTheme();\n    };\n    Editor.prototype.setStyle = function (style) {\n      this.renderer.setStyle(style);\n    };\n    Editor.prototype.unsetStyle = function (style) {\n      this.renderer.unsetStyle(style);\n    };\n    Editor.prototype.getFontSize = function () {\n      return (\n        this.getOption(\"fontSize\") || dom.computedStyle(this.container).fontSize\n      );\n    };\n    Editor.prototype.setFontSize = function (size) {\n      this.setOption(\"fontSize\", size);\n    };\n    Editor.prototype.$highlightBrackets = function () {\n      if (this.$highlightPending) {\n        return;\n      }\n      var self = this;\n      this.$highlightPending = true;\n      setTimeout(function () {\n        self.$highlightPending = false;\n        var session = self.session;\n        if (!session || session.destroyed) return;\n        if (session.$bracketHighlight) {\n          session.$bracketHighlight.markerIds.forEach(function (id) {\n            session.removeMarker(id);\n          });\n          session.$bracketHighlight = null;\n        }\n        var pos = self.getCursorPosition();\n        var handler = self.getKeyboardHandler();\n        var isBackwards =\n          handler &&\n          handler.$getDirectionForHighlight &&\n          handler.$getDirectionForHighlight(self);\n        var ranges = session.getMatchingBracketRanges(pos, isBackwards);\n        if (!ranges) {\n          var iterator = new TokenIterator(session, pos.row, pos.column);\n          var token = iterator.getCurrentToken();\n          if (token && /\\b(?:tag-open|tag-name)/.test(token.type)) {\n            var tagNamesRanges = session.getMatchingTags(pos);\n            if (tagNamesRanges)\n              ranges = [\n                tagNamesRanges.openTagName,\n                tagNamesRanges.closeTagName,\n              ];\n          }\n        }\n        if (!ranges && session.$mode.getMatching)\n          ranges = session.$mode.getMatching(self.session);\n        if (!ranges) {\n          if (self.getHighlightIndentGuides())\n            self.renderer.$textLayer.$highlightIndentGuide();\n          return;\n        }\n        var markerType = \"ace_bracket\";\n        if (!Array.isArray(ranges)) {\n          ranges = [ranges];\n        } else if (ranges.length == 1) {\n          markerType = \"ace_error_bracket\";\n        }\n        if (ranges.length == 2) {\n          if (Range.comparePoints(ranges[0].end, ranges[1].start) == 0)\n            ranges = [Range.fromPoints(ranges[0].start, ranges[1].end)];\n          else if (Range.comparePoints(ranges[0].start, ranges[1].end) == 0)\n            ranges = [Range.fromPoints(ranges[1].start, ranges[0].end)];\n        }\n        session.$bracketHighlight = {\n          ranges: ranges,\n          markerIds: ranges.map(function (range) {\n            return session.addMarker(range, markerType, \"text\");\n          }),\n        };\n        if (self.getHighlightIndentGuides())\n          self.renderer.$textLayer.$highlightIndentGuide();\n      }, 50);\n    };\n    Editor.prototype.focus = function () {\n      this.textInput.focus();\n    };\n    Editor.prototype.isFocused = function () {\n      return this.textInput.isFocused();\n    };\n    Editor.prototype.blur = function () {\n      this.textInput.blur();\n    };\n    Editor.prototype.onFocus = function (e) {\n      if (this.$isFocused) return;\n      this.$isFocused = true;\n      this.renderer.showCursor();\n      this.renderer.visualizeFocus();\n      this._emit(\"focus\", e);\n    };\n    Editor.prototype.onBlur = function (e) {\n      if (!this.$isFocused) return;\n      this.$isFocused = false;\n      this.renderer.hideCursor();\n      this.renderer.visualizeBlur();\n      this._emit(\"blur\", e);\n    };\n    Editor.prototype.$cursorChange = function () {\n      this.renderer.updateCursor();\n      this.$highlightBrackets();\n      this.$updateHighlightActiveLine();\n    };\n    Editor.prototype.onDocumentChange = function (delta) {\n      var wrap = this.session.$useWrapMode;\n      var lastRow = delta.start.row == delta.end.row ? delta.end.row : Infinity;\n      this.renderer.updateLines(delta.start.row, lastRow, wrap);\n      this._signal(\"change\", delta);\n      this.$cursorChange();\n    };\n    Editor.prototype.onTokenizerUpdate = function (e) {\n      var rows = e.data;\n      this.renderer.updateLines(rows.first, rows.last);\n    };\n    Editor.prototype.onScrollTopChange = function () {\n      this.renderer.scrollToY(this.session.getScrollTop());\n    };\n    Editor.prototype.onScrollLeftChange = function () {\n      this.renderer.scrollToX(this.session.getScrollLeft());\n    };\n    Editor.prototype.onCursorChange = function () {\n      this.$cursorChange();\n      this._signal(\"changeSelection\");\n    };\n    Editor.prototype.$updateHighlightActiveLine = function () {\n      var session = this.getSession();\n      var highlight;\n      if (this.$highlightActiveLine) {\n        if (this.$selectionStyle != \"line\" || !this.selection.isMultiLine())\n          highlight = this.getCursorPosition();\n        if (\n          this.renderer.theme &&\n          this.renderer.theme.$selectionColorConflict &&\n          !this.selection.isEmpty()\n        )\n          highlight = false;\n        if (\n          this.renderer.$maxLines &&\n          this.session.getLength() === 1 &&\n          !(this.renderer.$minLines > 1)\n        )\n          highlight = false;\n      }\n      if (session.$highlightLineMarker && !highlight) {\n        session.removeMarker(session.$highlightLineMarker.id);\n        session.$highlightLineMarker = null;\n      } else if (!session.$highlightLineMarker && highlight) {\n        var range = new Range(\n          highlight.row,\n          highlight.column,\n          highlight.row,\n          Infinity,\n        );\n        range.id = session.addMarker(range, \"ace_active-line\", \"screenLine\");\n        session.$highlightLineMarker = range;\n      } else if (highlight) {\n        session.$highlightLineMarker.start.row = highlight.row;\n        session.$highlightLineMarker.end.row = highlight.row;\n        session.$highlightLineMarker.start.column = highlight.column;\n        session._signal(\"changeBackMarker\");\n      }\n    };\n    Editor.prototype.onSelectionChange = function (e) {\n      var session = this.session;\n      if (session.$selectionMarker) {\n        session.removeMarker(session.$selectionMarker);\n      }\n      session.$selectionMarker = null;\n      if (!this.selection.isEmpty()) {\n        var range = this.selection.getRange();\n        var style = this.getSelectionStyle();\n        session.$selectionMarker = session.addMarker(\n          range,\n          \"ace_selection\",\n          style,\n        );\n      } else {\n        this.$updateHighlightActiveLine();\n      }\n      var re =\n        this.$highlightSelectedWord && this.$getSelectionHighLightRegexp();\n      this.session.highlight(re);\n      this._signal(\"changeSelection\");\n    };\n    Editor.prototype.$getSelectionHighLightRegexp = function () {\n      var session = this.session;\n      var selection = this.getSelectionRange();\n      if (selection.isEmpty() || selection.isMultiLine()) return;\n      var startColumn = selection.start.column;\n      var endColumn = selection.end.column;\n      var line = session.getLine(selection.start.row);\n      var needle = line.substring(startColumn, endColumn);\n      if (needle.length > 5000 || !/[\\w\\d]/.test(needle)) return;\n      var re = this.$search.$assembleRegExp({\n        wholeWord: true,\n        caseSensitive: true,\n        needle: needle,\n      });\n      var wordWithBoundary = line.substring(startColumn - 1, endColumn + 1);\n      if (!re.test(wordWithBoundary)) return;\n      return re;\n    };\n    Editor.prototype.onChangeFrontMarker = function () {\n      this.renderer.updateFrontMarkers();\n    };\n    Editor.prototype.onChangeBackMarker = function () {\n      this.renderer.updateBackMarkers();\n    };\n    Editor.prototype.onChangeBreakpoint = function () {\n      this.renderer.updateBreakpoints();\n    };\n    Editor.prototype.onChangeAnnotation = function () {\n      this.renderer.setAnnotations(this.session.getAnnotations());\n    };\n    Editor.prototype.onChangeMode = function (e) {\n      this.renderer.updateText();\n      this._emit(\"changeMode\", e);\n    };\n    Editor.prototype.onChangeWrapLimit = function () {\n      this.renderer.updateFull();\n    };\n    Editor.prototype.onChangeWrapMode = function () {\n      this.renderer.onResize(true);\n    };\n    Editor.prototype.onChangeFold = function () {\n      this.$updateHighlightActiveLine();\n      this.renderer.updateFull();\n    };\n    Editor.prototype.getSelectedText = function () {\n      return this.session.getTextRange(this.getSelectionRange());\n    };\n    Editor.prototype.getCopyText = function () {\n      var text = this.getSelectedText();\n      var nl = this.session.doc.getNewLineCharacter();\n      var copyLine = false;\n      if (!text && this.$copyWithEmptySelection) {\n        copyLine = true;\n        var ranges = this.selection.getAllRanges();\n        for (var i = 0; i < ranges.length; i++) {\n          var range = ranges[i];\n          if (i && ranges[i - 1].start.row == range.start.row) continue;\n          text += this.session.getLine(range.start.row) + nl;\n        }\n      }\n      var e = { text: text };\n      this._signal(\"copy\", e);\n      clipboard.lineMode = copyLine ? e.text : false;\n      return e.text;\n    };\n    Editor.prototype.onCopy = function () {\n      this.commands.exec(\"copy\", this);\n    };\n    Editor.prototype.onCut = function () {\n      this.commands.exec(\"cut\", this);\n    };\n    Editor.prototype.onPaste = function (text, event) {\n      var e = { text: text, event: event };\n      this.commands.exec(\"paste\", this, e);\n    };\n    Editor.prototype.$handlePaste = function (e) {\n      if (typeof e == \"string\") e = { text: e };\n      this._signal(\"paste\", e);\n      var text = e.text;\n      var lineMode = text === clipboard.lineMode;\n      var session = this.session;\n      if (!this.inMultiSelectMode || this.inVirtualSelectionMode) {\n        if (lineMode)\n          session.insert({ row: this.selection.lead.row, column: 0 }, text);\n        else this.insert(text);\n      } else if (lineMode) {\n        this.selection.rangeList.ranges.forEach(function (range) {\n          session.insert({ row: range.start.row, column: 0 }, text);\n        });\n      } else {\n        var lines = text.split(/\\r\\n|\\r|\\n/);\n        var ranges = this.selection.rangeList.ranges;\n        var isFullLine = lines.length == 2 && (!lines[0] || !lines[1]);\n        if (lines.length != ranges.length || isFullLine)\n          return this.commands.exec(\"insertstring\", this, text);\n        for (var i = ranges.length; i--; ) {\n          var range = ranges[i];\n          if (!range.isEmpty()) session.remove(range);\n          session.insert(range.start, lines[i]);\n        }\n      }\n    };\n    Editor.prototype.execCommand = function (command, args) {\n      return this.commands.exec(command, this, args);\n    };\n    Editor.prototype.insert = function (text, pasted) {\n      var session = this.session;\n      var mode = session.getMode();\n      var cursor = this.getCursorPosition();\n      if (this.getBehavioursEnabled() && !pasted) {\n        var transform = mode.transformAction(\n          session.getState(cursor.row),\n          \"insertion\",\n          this,\n          session,\n          text,\n        );\n        if (transform) {\n          if (text !== transform.text) {\n            if (!this.inVirtualSelectionMode) {\n              this.session.mergeUndoDeltas = false;\n              this.mergeNextCommand = false;\n            }\n          }\n          text = transform.text;\n        }\n      }\n      if (text == \"\\t\") text = this.session.getTabString();\n      if (!this.selection.isEmpty()) {\n        var range = this.getSelectionRange();\n        cursor = this.session.remove(range);\n        this.clearSelection();\n      } else if (this.session.getOverwrite() && text.indexOf(\"\\n\") == -1) {\n        var range = Range.fromPoints(cursor, cursor);\n        range.end.column += text.length;\n        this.session.remove(range);\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(\n            cursor.row,\n            cursor.column,\n            cursor.column + d,\n          );\n        }\n      }\n      this.clearSelection();\n      var start = cursor.column;\n      var lineState = session.getState(cursor.row);\n      var line = session.getLine(cursor.row);\n      var shouldOutdent = mode.checkOutdent(lineState, line, text);\n      session.insert(cursor, text);\n      if (transform && transform.selection) {\n        if (transform.selection.length == 2) {\n          // Transform relative to the current column\n          this.selection.setSelectionRange(\n            new Range(\n              cursor.row,\n              start + transform.selection[0],\n              cursor.row,\n              start + transform.selection[1],\n            ),\n          );\n        } else {\n          // Transform relative to the current row.\n          this.selection.setSelectionRange(\n            new Range(\n              cursor.row + transform.selection[0],\n              transform.selection[1],\n              cursor.row + transform.selection[2],\n              transform.selection[3],\n            ),\n          );\n        }\n      }\n      if (this.$enableAutoIndent) {\n        if (session.getDocument().isNewLine(text)) {\n          var lineIndent = mode.getNextLineIndent(\n            lineState,\n            line.slice(0, cursor.column),\n            session.getTabString(),\n          );\n          session.insert({ row: cursor.row + 1, column: 0 }, lineIndent);\n        }\n        if (shouldOutdent) mode.autoOutdent(lineState, session, cursor.row);\n      }\n    };\n    Editor.prototype.autoIndent = function () {\n      var session = this.session;\n      var mode = session.getMode();\n      var startRow, endRow;\n      if (this.selection.isEmpty()) {\n        startRow = 0;\n        endRow = session.doc.getLength() - 1;\n      } else {\n        var selectedRange = this.getSelectionRange();\n        startRow = selectedRange.start.row;\n        endRow = selectedRange.end.row;\n      }\n      var prevLineState = \"\";\n      var prevLine = \"\";\n      var lineIndent = \"\";\n      var line, currIndent, range;\n      var tab = session.getTabString();\n      for (var row = startRow; row <= endRow; row++) {\n        if (row > 0) {\n          prevLineState = session.getState(row - 1);\n          prevLine = session.getLine(row - 1);\n          lineIndent = mode.getNextLineIndent(prevLineState, prevLine, tab);\n        }\n        line = session.getLine(row);\n        currIndent = mode.$getIndent(line);\n        if (lineIndent !== currIndent) {\n          if (currIndent.length > 0) {\n            range = new Range(row, 0, row, currIndent.length);\n            session.remove(range);\n          }\n          if (lineIndent.length > 0) {\n            session.insert({ row: row, column: 0 }, lineIndent);\n          }\n        }\n        mode.autoOutdent(prevLineState, session, row);\n      }\n    };\n    Editor.prototype.onTextInput = function (text, composition) {\n      if (!composition) return this.keyBinding.onTextInput(text);\n      this.startOperation({ command: { name: \"insertstring\" } });\n      var applyComposition = this.applyComposition.bind(\n        this,\n        text,\n        composition,\n      );\n      if (this.selection.rangeCount) this.forEachSelection(applyComposition);\n      else applyComposition();\n      this.endOperation();\n    };\n    Editor.prototype.applyComposition = function (text, composition) {\n      if (composition.extendLeft || composition.extendRight) {\n        var r = this.selection.getRange();\n        r.start.column -= composition.extendLeft;\n        r.end.column += composition.extendRight;\n        if (r.start.column < 0) {\n          r.start.row--;\n          r.start.column += this.session.getLine(r.start.row).length + 1;\n        }\n        this.selection.setRange(r);\n        if (!text && !r.isEmpty()) this.remove();\n      }\n      if (text || !this.selection.isEmpty()) this.insert(text, true);\n      if (composition.restoreStart || composition.restoreEnd) {\n        var r = this.selection.getRange();\n        r.start.column -= composition.restoreStart;\n        r.end.column -= composition.restoreEnd;\n        this.selection.setRange(r);\n      }\n    };\n    Editor.prototype.onCommandKey = function (e, hashId, keyCode) {\n      return this.keyBinding.onCommandKey(e, hashId, keyCode);\n    };\n    Editor.prototype.setOverwrite = function (overwrite) {\n      this.session.setOverwrite(overwrite);\n    };\n    Editor.prototype.getOverwrite = function () {\n      return this.session.getOverwrite();\n    };\n    Editor.prototype.toggleOverwrite = function () {\n      this.session.toggleOverwrite();\n    };\n    Editor.prototype.setScrollSpeed = function (speed) {\n      this.setOption(\"scrollSpeed\", speed);\n    };\n    Editor.prototype.getScrollSpeed = function () {\n      return this.getOption(\"scrollSpeed\");\n    };\n    Editor.prototype.setDragDelay = function (dragDelay) {\n      this.setOption(\"dragDelay\", dragDelay);\n    };\n    Editor.prototype.getDragDelay = function () {\n      return this.getOption(\"dragDelay\");\n    };\n    Editor.prototype.setSelectionStyle = function (val) {\n      this.setOption(\"selectionStyle\", val);\n    };\n    Editor.prototype.getSelectionStyle = function () {\n      return this.getOption(\"selectionStyle\");\n    };\n    Editor.prototype.setHighlightActiveLine = function (shouldHighlight) {\n      this.setOption(\"highlightActiveLine\", shouldHighlight);\n    };\n    Editor.prototype.getHighlightActiveLine = function () {\n      return this.getOption(\"highlightActiveLine\");\n    };\n    Editor.prototype.setHighlightGutterLine = function (shouldHighlight) {\n      this.setOption(\"highlightGutterLine\", shouldHighlight);\n    };\n    Editor.prototype.getHighlightGutterLine = function () {\n      return this.getOption(\"highlightGutterLine\");\n    };\n    Editor.prototype.setHighlightSelectedWord = function (shouldHighlight) {\n      this.setOption(\"highlightSelectedWord\", shouldHighlight);\n    };\n    Editor.prototype.getHighlightSelectedWord = function () {\n      return this.$highlightSelectedWord;\n    };\n    Editor.prototype.setAnimatedScroll = function (shouldAnimate) {\n      this.renderer.setAnimatedScroll(shouldAnimate);\n    };\n    Editor.prototype.getAnimatedScroll = function () {\n      return this.renderer.getAnimatedScroll();\n    };\n    Editor.prototype.setShowInvisibles = function (showInvisibles) {\n      this.renderer.setShowInvisibles(showInvisibles);\n    };\n    Editor.prototype.getShowInvisibles = function () {\n      return this.renderer.getShowInvisibles();\n    };\n    Editor.prototype.setDisplayIndentGuides = function (display) {\n      this.renderer.setDisplayIndentGuides(display);\n    };\n    Editor.prototype.getDisplayIndentGuides = function () {\n      return this.renderer.getDisplayIndentGuides();\n    };\n    Editor.prototype.setHighlightIndentGuides = function (highlight) {\n      this.renderer.setHighlightIndentGuides(highlight);\n    };\n    Editor.prototype.getHighlightIndentGuides = function () {\n      return this.renderer.getHighlightIndentGuides();\n    };\n    Editor.prototype.setShowPrintMargin = function (showPrintMargin) {\n      this.renderer.setShowPrintMargin(showPrintMargin);\n    };\n    Editor.prototype.getShowPrintMargin = function () {\n      return this.renderer.getShowPrintMargin();\n    };\n    Editor.prototype.setPrintMarginColumn = function (showPrintMargin) {\n      this.renderer.setPrintMarginColumn(showPrintMargin);\n    };\n    Editor.prototype.getPrintMarginColumn = function () {\n      return this.renderer.getPrintMarginColumn();\n    };\n    Editor.prototype.setReadOnly = function (readOnly) {\n      this.setOption(\"readOnly\", readOnly);\n    };\n    Editor.prototype.getReadOnly = function () {\n      return this.getOption(\"readOnly\");\n    };\n    Editor.prototype.setBehavioursEnabled = function (enabled) {\n      this.setOption(\"behavioursEnabled\", enabled);\n    };\n    Editor.prototype.getBehavioursEnabled = function () {\n      return this.getOption(\"behavioursEnabled\");\n    };\n    Editor.prototype.setWrapBehavioursEnabled = function (enabled) {\n      this.setOption(\"wrapBehavioursEnabled\", enabled);\n    };\n    Editor.prototype.getWrapBehavioursEnabled = function () {\n      return this.getOption(\"wrapBehavioursEnabled\");\n    };\n    Editor.prototype.setShowFoldWidgets = function (show) {\n      this.setOption(\"showFoldWidgets\", show);\n    };\n    Editor.prototype.getShowFoldWidgets = function () {\n      return this.getOption(\"showFoldWidgets\");\n    };\n    Editor.prototype.setFadeFoldWidgets = function (fade) {\n      this.setOption(\"fadeFoldWidgets\", fade);\n    };\n    Editor.prototype.getFadeFoldWidgets = function () {\n      return this.getOption(\"fadeFoldWidgets\");\n    };\n    Editor.prototype.remove = function (dir) {\n      if (this.selection.isEmpty()) {\n        if (dir == \"left\") this.selection.selectLeft();\n        else this.selection.selectRight();\n      }\n      var range = this.getSelectionRange();\n      if (this.getBehavioursEnabled()) {\n        var session = this.session;\n        var state = session.getState(range.start.row);\n        var new_range = session\n          .getMode()\n          .transformAction(state, \"deletion\", this, session, range);\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) range = new_range;\n      }\n      this.session.remove(range);\n      this.clearSelection();\n    };\n    Editor.prototype.removeWordRight = function () {\n      if (this.selection.isEmpty()) this.selection.selectWordRight();\n      this.session.remove(this.getSelectionRange());\n      this.clearSelection();\n    };\n    Editor.prototype.removeWordLeft = function () {\n      if (this.selection.isEmpty()) this.selection.selectWordLeft();\n      this.session.remove(this.getSelectionRange());\n      this.clearSelection();\n    };\n    Editor.prototype.removeToLineStart = function () {\n      if (this.selection.isEmpty()) this.selection.selectLineStart();\n      if (this.selection.isEmpty()) this.selection.selectLeft();\n      this.session.remove(this.getSelectionRange());\n      this.clearSelection();\n    };\n    Editor.prototype.removeToLineEnd = function () {\n      if (this.selection.isEmpty()) this.selection.selectLineEnd();\n      var range = this.getSelectionRange();\n      if (\n        range.start.column == range.end.column &&\n        range.start.row == range.end.row\n      ) {\n        range.end.column = 0;\n        range.end.row++;\n      }\n      this.session.remove(range);\n      this.clearSelection();\n    };\n    Editor.prototype.splitLine = function () {\n      if (!this.selection.isEmpty()) {\n        this.session.remove(this.getSelectionRange());\n        this.clearSelection();\n      }\n      var cursor = this.getCursorPosition();\n      this.insert(\"\\n\");\n      this.moveCursorToPosition(cursor);\n    };\n    Editor.prototype.setGhostText = function (text, position) {\n      if (!this.session.widgetManager) {\n        this.session.widgetManager = new LineWidgets(this.session);\n        this.session.widgetManager.attach(this);\n      }\n      this.renderer.setGhostText(text, position);\n    };\n    Editor.prototype.removeGhostText = function () {\n      if (!this.session.widgetManager) return;\n      this.renderer.removeGhostText();\n    };\n    Editor.prototype.transposeLetters = function () {\n      if (!this.selection.isEmpty()) {\n        return;\n      }\n      var cursor = this.getCursorPosition();\n      var column = cursor.column;\n      if (column === 0) return;\n      var line = this.session.getLine(cursor.row);\n      var swap, range;\n      if (column < line.length) {\n        swap = line.charAt(column) + line.charAt(column - 1);\n        range = new Range(cursor.row, column - 1, cursor.row, column + 1);\n      } else {\n        swap = line.charAt(column - 1) + line.charAt(column - 2);\n        range = new Range(cursor.row, column - 2, cursor.row, column);\n      }\n      this.session.replace(range, swap);\n      this.session.selection.moveToPosition(range.end);\n    };\n    Editor.prototype.toLowerCase = function () {\n      var originalRange = this.getSelectionRange();\n      if (this.selection.isEmpty()) {\n        this.selection.selectWord();\n      }\n      var range = this.getSelectionRange();\n      var text = this.session.getTextRange(range);\n      this.session.replace(range, text.toLowerCase());\n      this.selection.setSelectionRange(originalRange);\n    };\n    Editor.prototype.toUpperCase = function () {\n      var originalRange = this.getSelectionRange();\n      if (this.selection.isEmpty()) {\n        this.selection.selectWord();\n      }\n      var range = this.getSelectionRange();\n      var text = this.session.getTextRange(range);\n      this.session.replace(range, text.toUpperCase());\n      this.selection.setSelectionRange(originalRange);\n    };\n    Editor.prototype.indent = function () {\n      var session = this.session;\n      var range = this.getSelectionRange();\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      var line = session.getLine(range.start.row);\n      var position = range.start;\n      var size = session.getTabSize();\n      var column = session.documentToScreenColumn(\n        position.row,\n        position.column,\n      );\n      if (this.session.getUseSoftTabs()) {\n        var count = size - (column % size);\n        var indentString = lang.stringRepeat(\" \", count);\n      } else {\n        var count = column % size;\n        while (line[range.start.column - 1] == \" \" && count) {\n          range.start.column--;\n          count--;\n        }\n        this.selection.setSelectionRange(range);\n        indentString = \"\\t\";\n      }\n      return this.insert(indentString);\n    };\n    Editor.prototype.blockIndent = function () {\n      var rows = this.$getSelectedRows();\n      this.session.indentRows(rows.first, rows.last, \"\\t\");\n    };\n    Editor.prototype.blockOutdent = function () {\n      var selection = this.session.getSelection();\n      this.session.outdentRows(selection.getRange());\n    };\n    Editor.prototype.sortLines = function () {\n      var rows = this.$getSelectedRows();\n      var session = this.session;\n      var lines = [];\n      for (var i = rows.first; i <= rows.last; i++)\n        lines.push(session.getLine(i));\n      lines.sort(function (a, b) {\n        if (a.toLowerCase() < b.toLowerCase()) return -1;\n        if (a.toLowerCase() > b.toLowerCase()) return 1;\n        return 0;\n      });\n      var deleteRange = new Range(0, 0, 0, 0);\n      for (var i = rows.first; i <= rows.last; i++) {\n        var line = session.getLine(i);\n        deleteRange.start.row = i;\n        deleteRange.end.row = i;\n        deleteRange.end.column = line.length;\n        session.replace(deleteRange, lines[i - rows.first]);\n      }\n    };\n    Editor.prototype.toggleCommentLines = function () {\n      var state = this.session.getState(this.getCursorPosition().row);\n      var rows = this.$getSelectedRows();\n      this.session\n        .getMode()\n        .toggleCommentLines(state, this.session, rows.first, rows.last);\n    };\n    Editor.prototype.toggleBlockComment = function () {\n      var cursor = this.getCursorPosition();\n      var state = this.session.getState(cursor.row);\n      var range = this.getSelectionRange();\n      this.session\n        .getMode()\n        .toggleBlockComment(state, this.session, range, cursor);\n    };\n    Editor.prototype.getNumberAt = function (row, column) {\n      var _numberRx = /[\\-]?[0-9]+(?:\\.[0-9]+)?/g;\n      _numberRx.lastIndex = 0;\n      var s = this.session.getLine(row);\n      while (_numberRx.lastIndex < column) {\n        var m = _numberRx.exec(s);\n        if (m.index <= column && m.index + m[0].length >= column) {\n          var number = {\n            value: m[0],\n            start: m.index,\n            end: m.index + m[0].length,\n          };\n          return number;\n        }\n      }\n      return null;\n    };\n    Editor.prototype.modifyNumber = function (amount) {\n      var row = this.selection.getCursor().row;\n      var column = this.selection.getCursor().column;\n      var charRange = new Range(row, column - 1, row, column);\n      var c = this.session.getTextRange(charRange);\n      if (!isNaN(parseFloat(c)) && isFinite(c)) {\n        var nr = this.getNumberAt(row, column);\n        if (nr) {\n          var fp =\n            nr.value.indexOf(\".\") >= 0\n              ? nr.start + nr.value.indexOf(\".\") + 1\n              : nr.end;\n          var decimals = nr.start + nr.value.length - fp;\n          var t = parseFloat(nr.value);\n          t *= Math.pow(10, decimals);\n          if (fp !== nr.end && column < fp) {\n            amount *= Math.pow(10, nr.end - column - 1);\n          } else {\n            amount *= Math.pow(10, nr.end - column);\n          }\n          t += amount;\n          t /= Math.pow(10, decimals);\n          var nnr = t.toFixed(decimals);\n          var replaceRange = new Range(row, nr.start, row, nr.end);\n          this.session.replace(replaceRange, nnr);\n          this.moveCursorTo(\n            row,\n            Math.max(nr.start + 1, column + nnr.length - nr.value.length),\n          );\n        }\n      } else {\n        this.toggleWord();\n      }\n    };\n    Editor.prototype.toggleWord = function () {\n      var row = this.selection.getCursor().row;\n      var column = this.selection.getCursor().column;\n      this.selection.selectWord();\n      var currentState = this.getSelectedText();\n      var currWordStart = this.selection.getWordRange().start.column;\n      var wordParts = currentState\n        .replace(/([a-z]+|[A-Z]+)(?=[A-Z_]|$)/g, \"$1 \")\n        .split(/\\s/);\n      var delta = column - currWordStart - 1;\n      if (delta < 0) delta = 0;\n      var curLength = 0,\n        itLength = 0;\n      var that = this;\n      if (currentState.match(/[A-Za-z0-9_]+/)) {\n        wordParts.forEach(function (item, i) {\n          itLength = curLength + item.length;\n          if (delta >= curLength && delta <= itLength) {\n            currentState = item;\n            that.selection.clearSelection();\n            that.moveCursorTo(row, curLength + currWordStart);\n            that.selection.selectTo(row, itLength + currWordStart);\n          }\n          curLength = itLength;\n        });\n      }\n      var wordPairs = this.$toggleWordPairs;\n      var reg;\n      for (var i = 0; i < wordPairs.length; i++) {\n        var item = wordPairs[i];\n        for (var j = 0; j <= 1; j++) {\n          var negate = +!j;\n          var firstCondition = currentState.match(\n            new RegExp(\"^\\\\s?_?(\" + lang.escapeRegExp(item[j]) + \")\\\\s?$\", \"i\"),\n          );\n          if (firstCondition) {\n            var secondCondition = currentState.match(\n              new RegExp(\n                \"([_]|^|\\\\s)(\" +\n                  lang.escapeRegExp(firstCondition[1]) +\n                  \")($|\\\\s)\",\n                \"g\",\n              ),\n            );\n            if (secondCondition) {\n              reg = currentState.replace(\n                new RegExp(lang.escapeRegExp(item[j]), \"i\"),\n                function (result) {\n                  var res = item[negate];\n                  if (result.toUpperCase() == result) {\n                    res = res.toUpperCase();\n                  } else if (\n                    result.charAt(0).toUpperCase() == result.charAt(0)\n                  ) {\n                    res =\n                      res.substr(0, 0) +\n                      item[negate].charAt(0).toUpperCase() +\n                      res.substr(1);\n                  }\n                  return res;\n                },\n              );\n              this.insert(reg);\n              reg = \"\";\n            }\n          }\n        }\n      }\n    };\n    Editor.prototype.findLinkAt = function (row, column) {\n      var e_1, _a;\n      var line = this.session.getLine(row);\n      var wordParts = line.split(/((?:https?|ftp):\\/\\/[\\S]+)/);\n      var columnPosition = column;\n      if (columnPosition < 0) columnPosition = 0;\n      var previousPosition = 0,\n        currentPosition = 0,\n        match;\n      try {\n        for (\n          var wordParts_1 = __values(wordParts),\n            wordParts_1_1 = wordParts_1.next();\n          !wordParts_1_1.done;\n          wordParts_1_1 = wordParts_1.next()\n        ) {\n          var item = wordParts_1_1.value;\n          currentPosition = previousPosition + item.length;\n          if (\n            columnPosition >= previousPosition &&\n            columnPosition <= currentPosition\n          ) {\n            if (item.match(/((?:https?|ftp):\\/\\/[\\S]+)/)) {\n              match = item.replace(/[\\s:.,'\";}\\]]+$/, \"\");\n              break;\n            }\n          }\n          previousPosition = currentPosition;\n        }\n      } catch (e_1_1) {\n        e_1 = { error: e_1_1 };\n      } finally {\n        try {\n          if (wordParts_1_1 && !wordParts_1_1.done && (_a = wordParts_1.return))\n            _a.call(wordParts_1);\n        } finally {\n          if (e_1) throw e_1.error;\n        }\n      }\n      return match;\n    };\n    Editor.prototype.openLink = function () {\n      var cursor = this.selection.getCursor();\n      var url = this.findLinkAt(cursor.row, cursor.column);\n      if (url) window.open(url, \"_blank\");\n      return url != null;\n    };\n    Editor.prototype.removeLines = function () {\n      var rows = this.$getSelectedRows();\n      this.session.removeFullLines(rows.first, rows.last);\n      this.clearSelection();\n    };\n    Editor.prototype.duplicateSelection = function () {\n      var sel = this.selection;\n      var doc = this.session;\n      var range = sel.getRange();\n      var reverse = sel.isBackwards();\n      if (range.isEmpty()) {\n        var row = range.start.row;\n        doc.duplicateLines(row, row);\n      } else {\n        var point = reverse ? range.start : range.end;\n        var endPoint = doc.insert(point, doc.getTextRange(range));\n        range.start = point;\n        range.end = endPoint;\n        sel.setSelectionRange(range, reverse);\n      }\n    };\n    Editor.prototype.moveLinesDown = function () {\n      this.$moveLines(1, false);\n    };\n    Editor.prototype.moveLinesUp = function () {\n      this.$moveLines(-1, false);\n    };\n    Editor.prototype.moveText = function (range, toPosition, copy) {\n      return this.session.moveText(range, toPosition, copy);\n    };\n    Editor.prototype.copyLinesUp = function () {\n      this.$moveLines(-1, true);\n    };\n    Editor.prototype.copyLinesDown = function () {\n      this.$moveLines(1, true);\n    };\n    Editor.prototype.$moveLines = function (dir, copy) {\n      var rows, moved;\n      var selection = this.selection;\n      if (!selection.inMultiSelectMode || this.inVirtualSelectionMode) {\n        var range = selection.toOrientedRange();\n        rows = this.$getSelectedRows(range);\n        moved = this.session.$moveLines(rows.first, rows.last, copy ? 0 : dir);\n        if (copy && dir == -1) moved = 0;\n        range.moveBy(moved, 0);\n        selection.fromOrientedRange(range);\n      } else {\n        var ranges = selection.rangeList.ranges;\n        selection.rangeList.detach(this.session);\n        this.inVirtualSelectionMode = true;\n        var diff = 0;\n        var totalDiff = 0;\n        var l = ranges.length;\n        for (var i = 0; i < l; i++) {\n          var rangeIndex = i;\n          ranges[i].moveBy(diff, 0);\n          rows = this.$getSelectedRows(ranges[i]);\n          var first = rows.first;\n          var last = rows.last;\n          while (++i < l) {\n            if (totalDiff) ranges[i].moveBy(totalDiff, 0);\n            var subRows = this.$getSelectedRows(ranges[i]);\n            if (copy && subRows.first != last) break;\n            else if (!copy && subRows.first > last + 1) break;\n            last = subRows.last;\n          }\n          i--;\n          diff = this.session.$moveLines(first, last, copy ? 0 : dir);\n          if (copy && dir == -1) rangeIndex = i + 1;\n          while (rangeIndex <= i) {\n            ranges[rangeIndex].moveBy(diff, 0);\n            rangeIndex++;\n          }\n          if (!copy) diff = 0;\n          totalDiff += diff;\n        }\n        selection.fromOrientedRange(selection.ranges[0]);\n        selection.rangeList.attach(this.session);\n        this.inVirtualSelectionMode = false;\n      }\n    };\n    Editor.prototype.$getSelectedRows = function (range) {\n      range = (range || this.getSelectionRange()).collapseRows();\n      return {\n        first: this.session.getRowFoldStart(range.start.row),\n        last: this.session.getRowFoldEnd(range.end.row),\n      };\n    };\n    Editor.prototype.onCompositionStart = function (compositionState) {\n      this.renderer.showComposition(compositionState);\n    };\n    Editor.prototype.onCompositionUpdate = function (text) {\n      this.renderer.setCompositionText(text);\n    };\n    Editor.prototype.onCompositionEnd = function () {\n      this.renderer.hideComposition();\n    };\n    Editor.prototype.getFirstVisibleRow = function () {\n      return this.renderer.getFirstVisibleRow();\n    };\n    Editor.prototype.getLastVisibleRow = function () {\n      return this.renderer.getLastVisibleRow();\n    };\n    Editor.prototype.isRowVisible = function (row) {\n      return (\n        row >= this.getFirstVisibleRow() && row <= this.getLastVisibleRow()\n      );\n    };\n    Editor.prototype.isRowFullyVisible = function (row) {\n      return (\n        row >= this.renderer.getFirstFullyVisibleRow() &&\n        row <= this.renderer.getLastFullyVisibleRow()\n      );\n    };\n    Editor.prototype.$getVisibleRowCount = function () {\n      return (\n        this.renderer.getScrollBottomRow() - this.renderer.getScrollTopRow() + 1\n      );\n    };\n    Editor.prototype.$moveByPage = function (dir, select) {\n      var renderer = this.renderer;\n      var config = this.renderer.layerConfig;\n      var rows = dir * Math.floor(config.height / config.lineHeight);\n      if (select === true) {\n        this.selection.$moveSelection(function () {\n          this.moveCursorBy(rows, 0);\n        });\n      } else if (select === false) {\n        this.selection.moveCursorBy(rows, 0);\n        this.selection.clearSelection();\n      }\n      var scrollTop = renderer.scrollTop;\n      renderer.scrollBy(0, rows * config.lineHeight);\n      if (select != null) renderer.scrollCursorIntoView(null, 0.5);\n      renderer.animateScrolling(scrollTop);\n    };\n    Editor.prototype.selectPageDown = function () {\n      this.$moveByPage(1, true);\n    };\n    Editor.prototype.selectPageUp = function () {\n      this.$moveByPage(-1, true);\n    };\n    Editor.prototype.gotoPageDown = function () {\n      this.$moveByPage(1, false);\n    };\n    Editor.prototype.gotoPageUp = function () {\n      this.$moveByPage(-1, false);\n    };\n    Editor.prototype.scrollPageDown = function () {\n      this.$moveByPage(1);\n    };\n    Editor.prototype.scrollPageUp = function () {\n      this.$moveByPage(-1);\n    };\n    Editor.prototype.scrollToRow = function (row) {\n      this.renderer.scrollToRow(row);\n    };\n    Editor.prototype.scrollToLine = function (line, center, animate, callback) {\n      this.renderer.scrollToLine(line, center, animate, callback);\n    };\n    Editor.prototype.centerSelection = function () {\n      var range = this.getSelectionRange();\n      var pos = {\n        row: Math.floor(\n          range.start.row + (range.end.row - range.start.row) / 2,\n        ),\n        column: Math.floor(\n          range.start.column + (range.end.column - range.start.column) / 2,\n        ),\n      };\n      this.renderer.alignCursor(pos, 0.5);\n    };\n    Editor.prototype.getCursorPosition = function () {\n      return this.selection.getCursor();\n    };\n    Editor.prototype.getCursorPositionScreen = function () {\n      return this.session.documentToScreenPosition(this.getCursorPosition());\n    };\n    Editor.prototype.getSelectionRange = function () {\n      return this.selection.getRange();\n    };\n    Editor.prototype.selectAll = function () {\n      this.selection.selectAll();\n    };\n    Editor.prototype.clearSelection = function () {\n      this.selection.clearSelection();\n    };\n    Editor.prototype.moveCursorTo = function (row, column) {\n      this.selection.moveCursorTo(row, column);\n    };\n    Editor.prototype.moveCursorToPosition = function (pos) {\n      this.selection.moveCursorToPosition(pos);\n    };\n    Editor.prototype.jumpToMatching = function (select, expand) {\n      var cursor = this.getCursorPosition();\n      var iterator = new TokenIterator(this.session, cursor.row, cursor.column);\n      var prevToken = iterator.getCurrentToken();\n      var tokenCount = 0;\n      if (prevToken && prevToken.type.indexOf(\"tag-name\") !== -1) {\n        prevToken = iterator.stepBackward();\n      }\n      var token = prevToken || iterator.stepForward();\n      if (!token) return;\n      var matchType;\n      var found = false;\n      var depth = {};\n      var i = cursor.column - token.start;\n      var bracketType;\n      var brackets = {\n        \")\": \"(\",\n        \"(\": \"(\",\n        \"]\": \"[\",\n        \"[\": \"[\",\n        \"{\": \"{\",\n        \"}\": \"{\",\n      };\n      do {\n        if (token.value.match(/[{}()\\[\\]]/g)) {\n          for (; i < token.value.length && !found; i++) {\n            if (!brackets[token.value[i]]) {\n              continue;\n            }\n            bracketType =\n              brackets[token.value[i]] +\n              \".\" +\n              token.type.replace(\"rparen\", \"lparen\");\n            if (isNaN(depth[bracketType])) {\n              depth[bracketType] = 0;\n            }\n            switch (token.value[i]) {\n              case \"(\":\n              case \"[\":\n              case \"{\":\n                depth[bracketType]++;\n                break;\n              case \")\":\n              case \"]\":\n              case \"}\":\n                depth[bracketType]--;\n                if (depth[bracketType] === -1) {\n                  matchType = \"bracket\";\n                  found = true;\n                }\n                break;\n            }\n          }\n        } else if (token.type.indexOf(\"tag-name\") !== -1) {\n          if (isNaN(depth[token.value])) {\n            depth[token.value] = 0;\n          }\n          if (prevToken.value === \"<\" && tokenCount > 1) {\n            depth[token.value]++;\n          } else if (prevToken.value === \"</\") {\n            depth[token.value]--;\n          }\n          if (depth[token.value] === -1) {\n            matchType = \"tag\";\n            found = true;\n          }\n        }\n        if (!found) {\n          prevToken = token;\n          tokenCount++;\n          token = iterator.stepForward();\n          i = 0;\n        }\n      } while (token && !found);\n      if (!matchType) return;\n      var range, pos;\n      if (matchType === \"bracket\") {\n        range = this.session.getBracketRange(cursor);\n        if (!range) {\n          range = new Range(\n            iterator.getCurrentTokenRow(),\n            iterator.getCurrentTokenColumn() + i - 1,\n            iterator.getCurrentTokenRow(),\n            iterator.getCurrentTokenColumn() + i - 1,\n          );\n          pos = range.start;\n          if (\n            expand ||\n            (pos.row === cursor.row && Math.abs(pos.column - cursor.column) < 2)\n          )\n            range = this.session.getBracketRange(pos);\n        }\n      } else if (matchType === \"tag\") {\n        if (!token || token.type.indexOf(\"tag-name\") === -1) return;\n        range = new Range(\n          iterator.getCurrentTokenRow(),\n          iterator.getCurrentTokenColumn() - 2,\n          iterator.getCurrentTokenRow(),\n          iterator.getCurrentTokenColumn() - 2,\n        );\n        if (range.compare(cursor.row, cursor.column) === 0) {\n          var tagsRanges = this.session.getMatchingTags(cursor);\n          if (tagsRanges) {\n            if (tagsRanges.openTag.contains(cursor.row, cursor.column)) {\n              range = tagsRanges.closeTag;\n              pos = range.start;\n            } else {\n              range = tagsRanges.openTag;\n              if (\n                tagsRanges.closeTag.start.row === cursor.row &&\n                tagsRanges.closeTag.start.column === cursor.column\n              )\n                pos = range.end;\n              else pos = range.start;\n            }\n          }\n        }\n        pos = pos || range.start;\n      }\n      pos = (range && range.cursor) || pos;\n      if (pos) {\n        if (select) {\n          if (range && expand) {\n            this.selection.setRange(range);\n          } else if (range && range.isEqual(this.getSelectionRange())) {\n            this.clearSelection();\n          } else {\n            this.selection.selectTo(pos.row, pos.column);\n          }\n        } else {\n          this.selection.moveTo(pos.row, pos.column);\n        }\n      }\n    };\n    Editor.prototype.gotoLine = function (lineNumber, column, animate) {\n      this.selection.clearSelection();\n      this.session.unfold({ row: lineNumber - 1, column: column || 0 });\n      this.exitMultiSelectMode && this.exitMultiSelectMode();\n      this.moveCursorTo(lineNumber - 1, column || 0);\n      if (!this.isRowFullyVisible(lineNumber - 1))\n        this.scrollToLine(lineNumber - 1, true, animate);\n    };\n    Editor.prototype.navigateTo = function (row, column) {\n      this.selection.moveTo(row, column);\n    };\n    Editor.prototype.navigateUp = function (times) {\n      if (this.selection.isMultiLine() && !this.selection.isBackwards()) {\n        var selectionStart = this.selection.anchor.getPosition();\n        return this.moveCursorToPosition(selectionStart);\n      }\n      this.selection.clearSelection();\n      this.selection.moveCursorBy(-times || -1, 0);\n    };\n    Editor.prototype.navigateDown = function (times) {\n      if (this.selection.isMultiLine() && this.selection.isBackwards()) {\n        var selectionEnd = this.selection.anchor.getPosition();\n        return this.moveCursorToPosition(selectionEnd);\n      }\n      this.selection.clearSelection();\n      this.selection.moveCursorBy(times || 1, 0);\n    };\n    Editor.prototype.navigateLeft = function (times) {\n      if (!this.selection.isEmpty()) {\n        var selectionStart = this.getSelectionRange().start;\n        this.moveCursorToPosition(selectionStart);\n      } else {\n        times = times || 1;\n        while (times--) {\n          this.selection.moveCursorLeft();\n        }\n      }\n      this.clearSelection();\n    };\n    Editor.prototype.navigateRight = function (times) {\n      if (!this.selection.isEmpty()) {\n        var selectionEnd = this.getSelectionRange().end;\n        this.moveCursorToPosition(selectionEnd);\n      } else {\n        times = times || 1;\n        while (times--) {\n          this.selection.moveCursorRight();\n        }\n      }\n      this.clearSelection();\n    };\n    Editor.prototype.navigateLineStart = function () {\n      this.selection.moveCursorLineStart();\n      this.clearSelection();\n    };\n    Editor.prototype.navigateLineEnd = function () {\n      this.selection.moveCursorLineEnd();\n      this.clearSelection();\n    };\n    Editor.prototype.navigateFileEnd = function () {\n      this.selection.moveCursorFileEnd();\n      this.clearSelection();\n    };\n    Editor.prototype.navigateFileStart = function () {\n      this.selection.moveCursorFileStart();\n      this.clearSelection();\n    };\n    Editor.prototype.navigateWordRight = function () {\n      this.selection.moveCursorWordRight();\n      this.clearSelection();\n    };\n    Editor.prototype.navigateWordLeft = function () {\n      this.selection.moveCursorWordLeft();\n      this.clearSelection();\n    };\n    Editor.prototype.replace = function (replacement, options) {\n      if (options) this.$search.set(options);\n      var range = this.$search.find(this.session);\n      var replaced = 0;\n      if (!range) return replaced;\n      if (this.$tryReplace(range, replacement)) {\n        replaced = 1;\n      }\n      this.selection.setSelectionRange(range);\n      this.renderer.scrollSelectionIntoView(range.start, range.end);\n      return replaced;\n    };\n    Editor.prototype.replaceAll = function (replacement, options) {\n      if (options) {\n        this.$search.set(options);\n      }\n      var ranges = this.$search.findAll(this.session);\n      var replaced = 0;\n      if (!ranges.length) return replaced;\n      var selection = this.getSelectionRange();\n      this.selection.moveTo(0, 0);\n      for (var i = ranges.length - 1; i >= 0; --i) {\n        if (this.$tryReplace(ranges[i], replacement)) {\n          replaced++;\n        }\n      }\n      this.selection.setSelectionRange(selection);\n      return replaced;\n    };\n    Editor.prototype.$tryReplace = function (range, replacement) {\n      var input = this.session.getTextRange(range);\n      replacement = this.$search.replace(input, replacement);\n      if (replacement !== null) {\n        range.end = this.session.replace(range, replacement);\n        return range;\n      } else {\n        return null;\n      }\n    };\n    Editor.prototype.getLastSearchOptions = function () {\n      return this.$search.getOptions();\n    };\n    Editor.prototype.find = function (needle, options, animate) {\n      if (!options) options = {};\n      if (typeof needle == \"string\" || needle instanceof RegExp)\n        options.needle = needle;\n      else if (typeof needle == \"object\") oop.mixin(options, needle);\n      var range = this.selection.getRange();\n      if (options.needle == null) {\n        needle =\n          this.session.getTextRange(range) || this.$search.$options.needle;\n        if (!needle) {\n          range = this.session.getWordRange(\n            range.start.row,\n            range.start.column,\n          );\n          needle = this.session.getTextRange(range);\n        }\n        this.$search.set({ needle: needle });\n      }\n      this.$search.set(options);\n      if (!options.start) this.$search.set({ start: range });\n      var newRange = this.$search.find(this.session);\n      if (options.preventScroll) return newRange;\n      if (newRange) {\n        this.revealRange(newRange, animate);\n        return newRange;\n      }\n      if (options.backwards) range.start = range.end;\n      else range.end = range.start;\n      this.selection.setRange(range);\n    };\n    Editor.prototype.findNext = function (options, animate) {\n      this.find({ skipCurrent: true, backwards: false }, options, animate);\n    };\n    Editor.prototype.findPrevious = function (options, animate) {\n      this.find(options, { skipCurrent: true, backwards: true }, animate);\n    };\n    Editor.prototype.revealRange = function (range, animate) {\n      this.session.unfold(range);\n      this.selection.setSelectionRange(range);\n      var scrollTop = this.renderer.scrollTop;\n      this.renderer.scrollSelectionIntoView(range.start, range.end, 0.5);\n      if (animate !== false) this.renderer.animateScrolling(scrollTop);\n    };\n    Editor.prototype.undo = function () {\n      this.session.getUndoManager().undo(this.session);\n      this.renderer.scrollCursorIntoView(null, 0.5);\n    };\n    Editor.prototype.redo = function () {\n      this.session.getUndoManager().redo(this.session);\n      this.renderer.scrollCursorIntoView(null, 0.5);\n    };\n    Editor.prototype.destroy = function () {\n      if (this.$toDestroy) {\n        this.$toDestroy.forEach(function (el) {\n          el.destroy();\n        });\n        this.$toDestroy = null;\n      }\n      if (this.$mouseHandler) this.$mouseHandler.destroy();\n      this.renderer.destroy();\n      this._signal(\"destroy\", this);\n      if (this.session) this.session.destroy();\n      if (this._$emitInputEvent) this._$emitInputEvent.cancel();\n      this.removeAllListeners();\n    };\n    Editor.prototype.setAutoScrollEditorIntoView = function (enable) {\n      if (!enable) return;\n      var rect;\n      var self = this;\n      var shouldScroll = false;\n      if (!this.$scrollAnchor)\n        this.$scrollAnchor = document.createElement(\"div\");\n      var scrollAnchor = this.$scrollAnchor;\n      scrollAnchor.style.cssText = \"position:absolute\";\n      this.container.insertBefore(scrollAnchor, this.container.firstChild);\n      var onChangeSelection = this.on(\"changeSelection\", function () {\n        shouldScroll = true;\n      });\n      var onBeforeRender = this.renderer.on(\"beforeRender\", function () {\n        if (shouldScroll)\n          rect = self.renderer.container.getBoundingClientRect();\n      });\n      var onAfterRender = this.renderer.on(\"afterRender\", function () {\n        if (\n          shouldScroll &&\n          rect &&\n          (self.isFocused() || (self.searchBox && self.searchBox.isFocused()))\n        ) {\n          var renderer = self.renderer;\n          var pos = renderer.$cursorLayer.$pixelPos;\n          var config = renderer.layerConfig;\n          var top = pos.top - config.offset;\n          if (pos.top >= 0 && top + rect.top < 0) {\n            shouldScroll = true;\n          } else if (\n            pos.top < config.height &&\n            pos.top + rect.top + config.lineHeight > window.innerHeight\n          ) {\n            shouldScroll = false;\n          } else {\n            shouldScroll = null;\n          }\n          if (shouldScroll != null) {\n            scrollAnchor.style.top = top + \"px\";\n            scrollAnchor.style.left = pos.left + \"px\";\n            scrollAnchor.style.height = config.lineHeight + \"px\";\n            scrollAnchor.scrollIntoView(shouldScroll);\n          }\n          shouldScroll = rect = null;\n        }\n      });\n      this.setAutoScrollEditorIntoView = function (enable) {\n        if (enable) return;\n        delete this.setAutoScrollEditorIntoView;\n        this.off(\"changeSelection\", onChangeSelection);\n        this.renderer.off(\"afterRender\", onAfterRender);\n        this.renderer.off(\"beforeRender\", onBeforeRender);\n      };\n    };\n    Editor.prototype.$resetCursorStyle = function () {\n      var style = this.$cursorStyle || \"ace\";\n      var cursorLayer = this.renderer.$cursorLayer;\n      if (!cursorLayer) return;\n      cursorLayer.setSmoothBlinking(/smooth/.test(style));\n      cursorLayer.isBlinking = !this.$readOnly && style != \"wide\";\n      dom.setCssClass(\n        cursorLayer.element,\n        \"ace_slim-cursors\",\n        /slim/.test(style),\n      );\n    };\n    Editor.prototype.prompt = function (message, options, callback) {\n      var editor = this;\n      config.loadModule(\"ace/ext/prompt\", function (module) {\n        module.prompt(editor, message, options, callback);\n      });\n    };\n    return Editor;\n  })();\n  Editor.$uid = 0;\n  Editor.prototype.curOp = null;\n  Editor.prototype.prevOp = {};\n  Editor.prototype.$mergeableCommands = [\"backspace\", \"del\", \"insertstring\"];\n  Editor.prototype.$toggleWordPairs = [\n    [\"first\", \"last\"],\n    [\"true\", \"false\"],\n    [\"yes\", \"no\"],\n    [\"width\", \"height\"],\n    [\"top\", \"bottom\"],\n    [\"right\", \"left\"],\n    [\"on\", \"off\"],\n    [\"x\", \"y\"],\n    [\"get\", \"set\"],\n    [\"max\", \"min\"],\n    [\"horizontal\", \"vertical\"],\n    [\"show\", \"hide\"],\n    [\"add\", \"remove\"],\n    [\"up\", \"down\"],\n    [\"before\", \"after\"],\n    [\"even\", \"odd\"],\n    [\"in\", \"out\"],\n    [\"inside\", \"outside\"],\n    [\"next\", \"previous\"],\n    [\"increase\", \"decrease\"],\n    [\"attach\", \"detach\"],\n    [\"&&\", \"||\"],\n    [\"==\", \"!=\"],\n  ];\n  oop.implement(Editor.prototype, EventEmitter);\n  config.defineOptions(Editor.prototype, \"editor\", {\n    selectionStyle: {\n      set: function (style) {\n        this.onSelectionChange();\n        this._signal(\"changeSelectionStyle\", { data: style });\n      },\n      initialValue: \"line\",\n    },\n    highlightActiveLine: {\n      set: function () {\n        this.$updateHighlightActiveLine();\n      },\n      initialValue: true,\n    },\n    highlightSelectedWord: {\n      set: function (shouldHighlight) {\n        this.$onSelectionChange();\n      },\n      initialValue: true,\n    },\n    readOnly: {\n      set: function (readOnly) {\n        this.textInput.setReadOnly(readOnly);\n        this.$resetCursorStyle();\n      },\n      initialValue: false,\n    },\n    copyWithEmptySelection: {\n      set: function (value) {\n        this.textInput.setCopyWithEmptySelection(value);\n      },\n      initialValue: false,\n    },\n    cursorStyle: {\n      set: function (val) {\n        this.$resetCursorStyle();\n      },\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    enableAutoIndent: { initialValue: true },\n    autoScrollEditorIntoView: {\n      set: function (val) {\n        this.setAutoScrollEditorIntoView(val);\n      },\n    },\n    keyboardHandler: {\n      set: function (val) {\n        this.setKeyboardHandler(val);\n      },\n      get: function () {\n        return this.$keybindingId;\n      },\n      handlesSet: true,\n    },\n    value: {\n      set: function (val) {\n        this.session.setValue(val);\n      },\n      get: function () {\n        return this.getValue();\n      },\n      handlesSet: true,\n      hidden: true,\n    },\n    session: {\n      set: function (val) {\n        this.setSession(val);\n      },\n      get: function () {\n        return this.session;\n      },\n      handlesSet: true,\n      hidden: true,\n    },\n    showLineNumbers: {\n      set: function (show) {\n        this.renderer.$gutterLayer.setShowLineNumbers(show);\n        this.renderer.$loop.schedule(this.renderer.CHANGE_GUTTER);\n        if (show && this.$relativeLineNumbers)\n          relativeNumberRenderer.attach(this);\n        else relativeNumberRenderer.detach(this);\n      },\n      initialValue: true,\n    },\n    relativeLineNumbers: {\n      set: function (value) {\n        if (this.$showLineNumbers && value) relativeNumberRenderer.attach(this);\n        else relativeNumberRenderer.detach(this);\n      },\n    },\n    placeholder: {\n      set: function (message) {\n        if (!this.$updatePlaceholder) {\n          this.$updatePlaceholder = function () {\n            var hasValue =\n              this.session &&\n              (this.renderer.$composition ||\n                this.session.getLength() > 1 ||\n                this.session.getLine(0).length > 0);\n            if (hasValue && this.renderer.placeholderNode) {\n              this.renderer.off(\"afterRender\", this.$updatePlaceholder);\n              dom.removeCssClass(this.container, \"ace_hasPlaceholder\");\n              this.renderer.placeholderNode.remove();\n              this.renderer.placeholderNode = null;\n            } else if (!hasValue && !this.renderer.placeholderNode) {\n              this.renderer.on(\"afterRender\", this.$updatePlaceholder);\n              dom.addCssClass(this.container, \"ace_hasPlaceholder\");\n              var el = dom.createElement(\"div\");\n              el.className = \"ace_placeholder\";\n              el.textContent = this.$placeholder || \"\";\n              this.renderer.placeholderNode = el;\n              this.renderer.content.appendChild(this.renderer.placeholderNode);\n            } else if (!hasValue && this.renderer.placeholderNode) {\n              this.renderer.placeholderNode.textContent =\n                this.$placeholder || \"\";\n            }\n          }.bind(this);\n          this.on(\"input\", this.$updatePlaceholder);\n        }\n        this.$updatePlaceholder();\n      },\n    },\n    enableKeyboardAccessibility: {\n      set: function (value) {\n        var blurCommand = {\n          name: \"blurTextInput\",\n          description:\n            \"Set focus to the editor content div to allow tabbing through the page\",\n          bindKey: \"Esc\",\n          exec: function (editor) {\n            editor.blur();\n            editor.renderer.scroller.focus();\n          },\n          readOnly: true,\n        };\n        var focusOnEnterKeyup = function (e) {\n          if (\n            e.target == this.renderer.scroller &&\n            e.keyCode === keys[\"enter\"]\n          ) {\n            e.preventDefault();\n            var row = this.getCursorPosition().row;\n            if (!this.isRowVisible(row)) this.scrollToLine(row, true, true);\n            this.focus();\n          }\n        };\n        var gutterKeyboardHandler;\n        if (value) {\n          this.renderer.enableKeyboardAccessibility = true;\n          this.renderer.keyboardFocusClassName = \"ace_keyboard-focus\";\n          this.textInput.getElement().setAttribute(\"tabindex\", -1);\n          this.textInput.setNumberOfExtraLines(useragent.isWin ? 3 : 0);\n          this.renderer.scroller.setAttribute(\"tabindex\", 0);\n          this.renderer.scroller.setAttribute(\"role\", \"group\");\n          this.renderer.scroller.setAttribute(\n            \"aria-roledescription\",\n            nls(\"editor\"),\n          );\n          this.renderer.scroller.classList.add(\n            this.renderer.keyboardFocusClassName,\n          );\n          this.renderer.scroller.setAttribute(\n            \"aria-label\",\n            nls(\n              \"Editor content, press Enter to start editing, press Escape to exit\",\n            ),\n          );\n          this.renderer.scroller.addEventListener(\n            \"keyup\",\n            focusOnEnterKeyup.bind(this),\n          );\n          this.commands.addCommand(blurCommand);\n          this.renderer.$gutter.setAttribute(\"tabindex\", 0);\n          this.renderer.$gutter.setAttribute(\"aria-hidden\", false);\n          this.renderer.$gutter.setAttribute(\"role\", \"group\");\n          this.renderer.$gutter.setAttribute(\n            \"aria-roledescription\",\n            nls(\"editor\"),\n          );\n          this.renderer.$gutter.setAttribute(\n            \"aria-label\",\n            nls(\n              \"Editor gutter, press Enter to interact with controls using arrow keys, press Escape to exit\",\n            ),\n          );\n          this.renderer.$gutter.classList.add(\n            this.renderer.keyboardFocusClassName,\n          );\n          this.renderer.content.setAttribute(\"aria-hidden\", true);\n          if (!gutterKeyboardHandler)\n            gutterKeyboardHandler = new GutterKeyboardHandler(this);\n          gutterKeyboardHandler.addListener();\n        } else {\n          this.renderer.enableKeyboardAccessibility = false;\n          this.textInput.getElement().setAttribute(\"tabindex\", 0);\n          this.textInput.setNumberOfExtraLines(0);\n          this.renderer.scroller.setAttribute(\"tabindex\", -1);\n          this.renderer.scroller.removeAttribute(\"role\");\n          this.renderer.scroller.removeAttribute(\"aria-roledescription\");\n          this.renderer.scroller.classList.remove(\n            this.renderer.keyboardFocusClassName,\n          );\n          this.renderer.scroller.removeAttribute(\"aria-label\");\n          this.renderer.scroller.removeEventListener(\n            \"keyup\",\n            focusOnEnterKeyup.bind(this),\n          );\n          this.commands.removeCommand(blurCommand);\n          this.renderer.content.removeAttribute(\"aria-hidden\");\n          this.renderer.$gutter.setAttribute(\"tabindex\", -1);\n          this.renderer.$gutter.setAttribute(\"aria-hidden\", true);\n          this.renderer.$gutter.removeAttribute(\"role\");\n          this.renderer.$gutter.removeAttribute(\"aria-roledescription\");\n          this.renderer.$gutter.removeAttribute(\"aria-label\");\n          this.renderer.$gutter.classList.remove(\n            this.renderer.keyboardFocusClassName,\n          );\n          if (gutterKeyboardHandler) gutterKeyboardHandler.removeListener();\n        }\n      },\n      initialValue: false,\n    },\n    customScrollbar: \"renderer\",\n    hScrollBarAlwaysVisible: \"renderer\",\n    vScrollBarAlwaysVisible: \"renderer\",\n    highlightGutterLine: \"renderer\",\n    animatedScroll: \"renderer\",\n    showInvisibles: \"renderer\",\n    showPrintMargin: \"renderer\",\n    printMarginColumn: \"renderer\",\n    printMargin: \"renderer\",\n    fadeFoldWidgets: \"renderer\",\n    showFoldWidgets: \"renderer\",\n    displayIndentGuides: \"renderer\",\n    highlightIndentGuides: \"renderer\",\n    showGutter: \"renderer\",\n    fontSize: \"renderer\",\n    fontFamily: \"renderer\",\n    maxLines: \"renderer\",\n    minLines: \"renderer\",\n    scrollPastEnd: \"renderer\",\n    fixedWidthGutter: \"renderer\",\n    theme: \"renderer\",\n    hasCssTransforms: \"renderer\",\n    maxPixelHeight: \"renderer\",\n    useTextareaForIME: \"renderer\",\n    useResizeObserver: \"renderer\",\n    useSvgGutterIcons: \"renderer\",\n    showFoldedAnnotations: \"renderer\",\n    scrollSpeed: \"$mouseHandler\",\n    dragDelay: \"$mouseHandler\",\n    dragEnabled: \"$mouseHandler\",\n    focusTimeout: \"$mouseHandler\",\n    tooltipFollowsMouse: \"$mouseHandler\",\n    firstLineNumber: \"session\",\n    overwrite: \"session\",\n    newLineMode: \"session\",\n    useWorker: \"session\",\n    useSoftTabs: \"session\",\n    navigateWithinSoftTabs: \"session\",\n    tabSize: \"session\",\n    wrap: \"session\",\n    indentedSoftWrap: \"session\",\n    foldStyle: \"session\",\n    mode: \"session\",\n  });\n  var relativeNumberRenderer = {\n    getText: function (\n      /**@type{EditSession}*/ session,\n      /**@type{number}*/ row,\n    ) {\n      return (\n        (Math.abs(session.selection.lead.row - row) ||\n          row + 1 + (row < 9 ? \"\\xb7\" : \"\")) + \"\"\n      );\n    },\n    getWidth: function (session, /**@type{number}*/ lastLineNumber, config) {\n      return (\n        Math.max(\n          lastLineNumber.toString().length,\n          (config.lastRow + 1).toString().length,\n          2,\n        ) * config.characterWidth\n      );\n    },\n    update: function (e, /**@type{Editor}*/ editor) {\n      editor.renderer.$loop.schedule(editor.renderer.CHANGE_GUTTER);\n    },\n    attach: function (/**@type{Editor}*/ editor) {\n      editor.renderer.$gutterLayer.$renderer = this;\n      editor.on(\"changeSelection\", this.update);\n      this.update(null, editor);\n    },\n    detach: function (/**@type{Editor}*/ editor) {\n      if (editor.renderer.$gutterLayer.$renderer == this)\n        editor.renderer.$gutterLayer.$renderer = null;\n      editor.off(\"changeSelection\", this.update);\n      this.update(null, editor);\n    },\n  };\n  exports.Editor = Editor;\n});\n\ndefine(\"ace/layer/lines\", [\n  \"require\",\n  \"exports\",\n  \"module\",\n  \"ace/lib/dom\",\n], function (require, exports, module) {\n  \"use strict\";\n  var dom = require(\"../lib/dom\");\n  var Lines = /** @class */ (function () {\n    function Lines(element, canvasHeight) {\n      this.element = element;\n      this.canvasHeight = canvasHeight || 500000;\n      this.element.style.height = this.canvasHeight * 2 + \"px\";\n      this.cells = [];\n      this.cellCache = [];\n      this.$offsetCoefficient = 0;\n    }\n    Lines.prototype.moveContainer = function (config) {\n      dom.translate(\n        this.element,\n        0,\n        -((config.firstRowScreen * config.lineHeight) % this.canvasHeight) -\n          config.offset * this.$offsetCoefficient,\n      );\n    };\n    Lines.prototype.pageChanged = function (oldConfig, newConfig) {\n      return (\n        Math.floor(\n          (oldConfig.firstRowScreen * oldConfig.lineHeight) / this.canvasHeight,\n        ) !==\n        Math.floor(\n          (newConfig.firstRowScreen * newConfig.lineHeight) / this.canvasHeight,\n        )\n      );\n    };\n    Lines.prototype.computeLineTop = function (row, config, session) {\n      var screenTop = config.firstRowScreen * config.lineHeight;\n      var screenPage = Math.floor(screenTop / this.canvasHeight);\n      var lineTop = session.documentToScreenRow(row, 0) * config.lineHeight;\n      return lineTop - screenPage * this.canvasHeight;\n    };\n    Lines.prototype.computeLineHeight = function (row, config, session) {\n      return config.lineHeight * session.getRowLineCount(row);\n    };\n    Lines.prototype.getLength = function () {\n      return this.cells.length;\n    };\n    Lines.prototype.get = function (index) {\n      return this.cells[index];\n    };\n    Lines.prototype.shift = function () {\n      this.$cacheCell(this.cells.shift());\n    };\n    Lines.prototype.pop = function () {\n      this.$cacheCell(this.cells.pop());\n    };\n    Lines.prototype.push = function (cell) {\n      if (Array.isArray(cell)) {\n        this.cells.push.apply(this.cells, cell);\n        var fragment = dom.createFragment(this.element);\n        for (var i = 0; i < cell.length; i++) {\n          fragment.appendChild(cell[i].element);\n        }\n        this.element.appendChild(fragment);\n      } else {\n        this.cells.push(cell);\n        this.element.appendChild(cell.element);\n      }\n    };\n    Lines.prototype.unshift = function (cell) {\n      if (Array.isArray(cell)) {\n        this.cells.unshift.apply(this.cells, cell);\n        var fragment = dom.createFragment(this.element);\n        for (var i = 0; i < cell.length; i++) {\n          fragment.appendChild(cell[i].element);\n        }\n        if (this.element.firstChild)\n          this.element.insertBefore(fragment, this.element.firstChild);\n        else this.element.appendChild(fragment);\n      } else {\n        this.cells.unshift(cell);\n        this.element.insertAdjacentElement(\"afterbegin\", cell.element);\n      }\n    };\n    Lines.prototype.last = function () {\n      if (this.cells.length) return this.cells[this.cells.length - 1];\n      else return null;\n    };\n    Lines.prototype.$cacheCell = function (cell) {\n      if (!cell) return;\n      cell.element.remove();\n      this.cellCache.push(cell);\n    };\n    Lines.prototype.createCell = function (row, config, session, initElement) {\n      var cell = this.cellCache.pop();\n      if (!cell) {\n        var element = dom.createElement(\"div\");\n        if (initElement) initElement(element);\n        this.element.appendChild(element);\n        cell = {\n          element: element,\n          text: \"\",\n          row: row,\n        };\n      }\n      cell.row = row;\n      return cell;\n    };\n    return Lines;\n  })();\n  exports.Lines = Lines;\n});\n\ndefine(\"ace/layer/gutter\", [\n  \"require\",\n  \"exports\",\n  \"module\",\n  \"ace/lib/dom\",\n  \"ace/lib/oop\",\n  \"ace/lib/lang\",\n  \"ace/lib/event_emitter\",\n  \"ace/layer/lines\",\n  \"ace/config\",\n], function (require, exports, module) {\n  \"use strict\";\n  var dom = require(\"../lib/dom\");\n  var oop = require(\"../lib/oop\");\n  var lang = require(\"../lib/lang\");\n  var EventEmitter = require(\"../lib/event_emitter\").EventEmitter;\n  var Lines = require(\"./lines\").Lines;\n  var nls = require(\"../config\").nls;\n  var Gutter = /** @class */ (function () {\n    function Gutter(parentEl) {\n      this.element = dom.createElement(\"div\");\n      this.element.className = \"ace_layer ace_gutter-layer\";\n      parentEl.appendChild(this.element);\n      this.setShowFoldWidgets(this.$showFoldWidgets);\n      this.gutterWidth = 0;\n      this.$annotations = [];\n      this.$updateAnnotations = this.$updateAnnotations.bind(this);\n      this.$lines = new Lines(this.element);\n      this.$lines.$offsetCoefficient = 1;\n    }\n    Gutter.prototype.setSession = function (session) {\n      if (this.session) this.session.off(\"change\", this.$updateAnnotations);\n      this.session = session;\n      if (session) session.on(\"change\", this.$updateAnnotations);\n    };\n    Gutter.prototype.addGutterDecoration = function (row, className) {\n      if (window.console)\n        console.warn &&\n          console.warn(\"deprecated use session.addGutterDecoration\");\n      this.session.addGutterDecoration(row, className);\n    };\n    Gutter.prototype.removeGutterDecoration = function (row, className) {\n      if (window.console)\n        console.warn &&\n          console.warn(\"deprecated use session.removeGutterDecoration\");\n      this.session.removeGutterDecoration(row, className);\n    };\n    Gutter.prototype.setAnnotations = function (annotations) {\n      this.$annotations = [];\n      for (var i = 0; i < annotations.length; i++) {\n        var annotation = annotations[i];\n        var row = annotation.row;\n        var rowInfo = this.$annotations[row];\n        if (!rowInfo) rowInfo = this.$annotations[row] = { text: [], type: [] };\n        var annoText = annotation.text;\n        var annoType = annotation.type;\n        annoText = annoText ? lang.escapeHTML(annoText) : annotation.html || \"\";\n        if (rowInfo.text.indexOf(annoText) === -1) {\n          rowInfo.text.push(annoText);\n          rowInfo.type.push(annoType);\n        }\n        var className = annotation.className;\n        if (className) rowInfo.className = className;\n        else if (annoType == \"error\") rowInfo.className = \" ace_error\";\n        else if (annoType == \"warning\" && rowInfo.className != \" ace_error\")\n          rowInfo.className = \" ace_warning\";\n        else if (annoType == \"info\" && !rowInfo.className)\n          rowInfo.className = \" ace_info\";\n      }\n    };\n    Gutter.prototype.$updateAnnotations = function (delta) {\n      if (!this.$annotations.length) return;\n      var firstRow = delta.start.row;\n      var len = delta.end.row - firstRow;\n      if (len === 0) {\n      } else if (delta.action == \"remove\") {\n        this.$annotations.splice(firstRow, len + 1, null);\n      } else {\n        var args = new Array(len + 1);\n        args.unshift(firstRow, 1);\n        this.$annotations.splice.apply(this.$annotations, args);\n      }\n    };\n    Gutter.prototype.update = function (config) {\n      this.config = config;\n      var session = this.session;\n      var firstRow = config.firstRow;\n      var lastRow = Math.min(\n        config.lastRow + config.gutterOffset, // needed to compensate for hor scollbar\n        session.getLength() - 1,\n      );\n      this.oldLastRow = lastRow;\n      this.config = config;\n      this.$lines.moveContainer(config);\n      this.$updateCursorRow();\n      var fold = session.getNextFoldLine(firstRow);\n      var foldStart = fold ? fold.start.row : Infinity;\n      var cell = null;\n      var index = -1;\n      var row = firstRow;\n      while (true) {\n        if (row > foldStart) {\n          row = fold.end.row + 1;\n          fold = session.getNextFoldLine(row, fold);\n          foldStart = fold ? fold.start.row : Infinity;\n        }\n        if (row > lastRow) {\n          while (this.$lines.getLength() > index + 1) this.$lines.pop();\n          break;\n        }\n        cell = this.$lines.get(++index);\n        if (cell) {\n          cell.row = row;\n        } else {\n          cell = this.$lines.createCell(\n            row,\n            config,\n            this.session,\n            onCreateCell,\n          );\n          this.$lines.push(cell);\n        }\n        this.$renderCell(cell, config, fold, row);\n        row++;\n      }\n      this._signal(\"afterRender\");\n      this.$updateGutterWidth(config);\n    };\n    Gutter.prototype.$updateGutterWidth = function (config) {\n      var session = this.session;\n      var gutterRenderer = session.gutterRenderer || this.$renderer;\n      var firstLineNumber = session.$firstLineNumber;\n      var lastLineText = this.$lines.last() ? this.$lines.last().text : \"\";\n      if (this.$fixedWidth || session.$useWrapMode)\n        lastLineText = session.getLength() + firstLineNumber - 1;\n      var gutterWidth = gutterRenderer\n        ? gutterRenderer.getWidth(session, lastLineText, config)\n        : lastLineText.toString().length * config.characterWidth;\n      var padding = this.$padding || this.$computePadding();\n      gutterWidth += padding.left + padding.right;\n      if (gutterWidth !== this.gutterWidth && !isNaN(gutterWidth)) {\n        this.gutterWidth = gutterWidth;\n        this.element.parentNode.style.width = this.element.style.width =\n          Math.ceil(this.gutterWidth) + \"px\";\n        this._signal(\"changeGutterWidth\", gutterWidth);\n      }\n    };\n    Gutter.prototype.$updateCursorRow = function () {\n      if (!this.$highlightGutterLine) return;\n      var position = this.session.selection.getCursor();\n      if (this.$cursorRow === position.row) return;\n      this.$cursorRow = position.row;\n    };\n    Gutter.prototype.updateLineHighlight = function () {\n      if (!this.$highlightGutterLine) return;\n      var row = this.session.selection.cursor.row;\n      this.$cursorRow = row;\n      if (this.$cursorCell && this.$cursorCell.row == row) return;\n      if (this.$cursorCell)\n        this.$cursorCell.element.className =\n          this.$cursorCell.element.className.replace(\n            \"ace_gutter-active-line \",\n            \"\",\n          );\n      var cells = this.$lines.cells;\n      this.$cursorCell = null;\n      for (var i = 0; i < cells.length; i++) {\n        var cell = cells[i];\n        if (cell.row >= this.$cursorRow) {\n          if (cell.row > this.$cursorRow) {\n            var fold = this.session.getFoldLine(this.$cursorRow);\n            if (i > 0 && fold && fold.start.row == cells[i - 1].row)\n              cell = cells[i - 1];\n            else break;\n          }\n          cell.element.className =\n            \"ace_gutter-active-line \" + cell.element.className;\n          this.$cursorCell = cell;\n          break;\n        }\n      }\n    };\n    Gutter.prototype.scrollLines = function (config) {\n      var oldConfig = this.config;\n      this.config = config;\n      this.$updateCursorRow();\n      if (this.$lines.pageChanged(oldConfig, config))\n        return this.update(config);\n      this.$lines.moveContainer(config);\n      var lastRow = Math.min(\n        config.lastRow + config.gutterOffset, // needed to compensate for hor scollbar\n        this.session.getLength() - 1,\n      );\n      var oldLastRow = this.oldLastRow;\n      this.oldLastRow = lastRow;\n      if (!oldConfig || oldLastRow < config.firstRow)\n        return this.update(config);\n      if (lastRow < oldConfig.firstRow) return this.update(config);\n      if (oldConfig.firstRow < config.firstRow)\n        for (\n          var row = this.session.getFoldedRowCount(\n            oldConfig.firstRow,\n            config.firstRow - 1,\n          );\n          row > 0;\n          row--\n        )\n          this.$lines.shift();\n      if (oldLastRow > lastRow)\n        for (\n          var row = this.session.getFoldedRowCount(lastRow + 1, oldLastRow);\n          row > 0;\n          row--\n        )\n          this.$lines.pop();\n      if (config.firstRow < oldConfig.firstRow) {\n        this.$lines.unshift(\n          this.$renderLines(config, config.firstRow, oldConfig.firstRow - 1),\n        );\n      }\n      if (lastRow > oldLastRow) {\n        this.$lines.push(this.$renderLines(config, oldLastRow + 1, lastRow));\n      }\n      this.updateLineHighlight();\n      this._signal(\"afterRender\");\n      this.$updateGutterWidth(config);\n    };\n    Gutter.prototype.$renderLines = function (config, firstRow, lastRow) {\n      var fragment = [];\n      var row = firstRow;\n      var foldLine = this.session.getNextFoldLine(row);\n      var foldStart = foldLine ? foldLine.start.row : Infinity;\n      while (true) {\n        if (row > foldStart) {\n          row = foldLine.end.row + 1;\n          foldLine = this.session.getNextFoldLine(row, foldLine);\n          foldStart = foldLine ? foldLine.start.row : Infinity;\n        }\n        if (row > lastRow) break;\n        var cell = this.$lines.createCell(\n          row,\n          config,\n          this.session,\n          onCreateCell,\n        );\n        this.$renderCell(cell, config, foldLine, row);\n        fragment.push(cell);\n        row++;\n      }\n      return fragment;\n    };\n    Gutter.prototype.$renderCell = function (cell, config, fold, row) {\n      var element = cell.element;\n      var session = this.session;\n      var textNode = element.childNodes[0];\n      var foldWidget = element.childNodes[1];\n      var annotationNode = element.childNodes[2];\n      var annotationIconNode = annotationNode.firstChild;\n      var firstLineNumber = session.$firstLineNumber;\n      var breakpoints = session.$breakpoints;\n      var decorations = session.$decorations;\n      var gutterRenderer = session.gutterRenderer || this.$renderer;\n      var foldWidgets = this.$showFoldWidgets && session.foldWidgets;\n      var foldStart = fold ? fold.start.row : Number.MAX_VALUE;\n      var lineHeight = config.lineHeight + \"px\";\n      var className = this.$useSvgGutterIcons\n        ? \"ace_gutter-cell_svg-icons \"\n        : \"ace_gutter-cell \";\n      var iconClassName = this.$useSvgGutterIcons ? \"ace_icon_svg\" : \"ace_icon\";\n      var rowText = (\n        gutterRenderer\n          ? gutterRenderer.getText(session, row)\n          : row + firstLineNumber\n      ).toString();\n      if (this.$highlightGutterLine) {\n        if (\n          row == this.$cursorRow ||\n          (fold &&\n            row < this.$cursorRow &&\n            row >= foldStart &&\n            this.$cursorRow <= fold.end.row)\n        ) {\n          className += \"ace_gutter-active-line \";\n          if (this.$cursorCell != cell) {\n            if (this.$cursorCell)\n              this.$cursorCell.element.className =\n                this.$cursorCell.element.className.replace(\n                  \"ace_gutter-active-line \",\n                  \"\",\n                );\n            this.$cursorCell = cell;\n          }\n        }\n      }\n      if (breakpoints[row]) className += breakpoints[row];\n      if (decorations[row]) className += decorations[row];\n      if (this.$annotations[row] && row !== foldStart)\n        className += this.$annotations[row].className;\n      if (foldWidgets) {\n        var c = foldWidgets[row];\n        if (c == null) c = foldWidgets[row] = session.getFoldWidget(row);\n      }\n      if (c) {\n        var foldClass = \"ace_fold-widget ace_\" + c;\n        var isClosedFold =\n          c == \"start\" && row == foldStart && row < fold.end.row;\n        if (isClosedFold) {\n          foldClass += \" ace_closed\";\n          var foldAnnotationClass = \"\";\n          var annotationInFold = false;\n          for (var i = row + 1; i <= fold.end.row; i++) {\n            if (!this.$annotations[i]) continue;\n            if (this.$annotations[i].className === \" ace_error\") {\n              annotationInFold = true;\n              foldAnnotationClass = \" ace_error_fold\";\n              break;\n            }\n            if (this.$annotations[i].className === \" ace_warning\") {\n              annotationInFold = true;\n              foldAnnotationClass = \" ace_warning_fold\";\n              continue;\n            }\n          }\n          className += foldAnnotationClass;\n        } else foldClass += \" ace_open\";\n        if (foldWidget.className != foldClass) foldWidget.className = foldClass;\n        dom.setStyle(foldWidget.style, \"height\", lineHeight);\n        dom.setStyle(foldWidget.style, \"display\", \"inline-block\");\n        foldWidget.setAttribute(\"role\", \"button\");\n        foldWidget.setAttribute(\"tabindex\", \"-1\");\n        var foldRange = session.getFoldWidgetRange(row);\n        if (foldRange)\n          foldWidget.setAttribute(\n            \"aria-label\",\n            nls(\"Toggle code folding, rows $0 through $1\", [\n              foldRange.start.row + 1,\n              foldRange.end.row + 1,\n            ]),\n          );\n        else {\n          if (fold)\n            foldWidget.setAttribute(\n              \"aria-label\",\n              nls(\"Toggle code folding, rows $0 through $1\", [\n                fold.start.row + 1,\n                fold.end.row + 1,\n              ]),\n            );\n          else\n            foldWidget.setAttribute(\n              \"aria-label\",\n              nls(\"Toggle code folding, row $0\", [row + 1]),\n            );\n        }\n        if (isClosedFold) {\n          foldWidget.setAttribute(\"aria-expanded\", \"false\");\n          foldWidget.setAttribute(\"title\", nls(\"Unfold code\"));\n        } else {\n          foldWidget.setAttribute(\"aria-expanded\", \"true\");\n          foldWidget.setAttribute(\"title\", nls(\"Fold code\"));\n        }\n      } else {\n        if (foldWidget) {\n          dom.setStyle(foldWidget.style, \"display\", \"none\");\n          foldWidget.setAttribute(\"tabindex\", \"0\");\n          foldWidget.removeAttribute(\"role\");\n          foldWidget.removeAttribute(\"aria-label\");\n        }\n      }\n      if (annotationInFold && this.$showFoldedAnnotations) {\n        annotationNode.className = \"ace_gutter_annotation\";\n        annotationIconNode.className = iconClassName;\n        annotationIconNode.className += foldAnnotationClass;\n        dom.setStyle(annotationIconNode.style, \"height\", lineHeight);\n        dom.setStyle(annotationNode.style, \"display\", \"block\");\n        dom.setStyle(annotationNode.style, \"height\", lineHeight);\n        annotationNode.setAttribute(\n          \"aria-label\",\n          nls(\"Read annotations row $0\", [rowText]),\n        );\n        annotationNode.setAttribute(\"tabindex\", \"-1\");\n        annotationNode.setAttribute(\"role\", \"button\");\n      } else if (this.$annotations[row]) {\n        annotationNode.className = \"ace_gutter_annotation\";\n        annotationIconNode.className = iconClassName;\n        if (this.$useSvgGutterIcons)\n          annotationIconNode.className += this.$annotations[row].className;\n        else\n          element.classList.add(\n            this.$annotations[row].className.replace(\" \", \"\"),\n          );\n        dom.setStyle(annotationIconNode.style, \"height\", lineHeight);\n        dom.setStyle(annotationNode.style, \"display\", \"block\");\n        dom.setStyle(annotationNode.style, \"height\", lineHeight);\n        annotationNode.setAttribute(\n          \"aria-label\",\n          nls(\"Read annotations row $0\", [rowText]),\n        );\n        annotationNode.setAttribute(\"tabindex\", \"-1\");\n        annotationNode.setAttribute(\"role\", \"button\");\n      } else {\n        dom.setStyle(annotationNode.style, \"display\", \"none\");\n        annotationNode.removeAttribute(\"aria-label\");\n        annotationNode.removeAttribute(\"role\");\n        annotationNode.setAttribute(\"tabindex\", \"0\");\n      }\n      if (rowText !== textNode.data) {\n        textNode.data = rowText;\n      }\n      if (element.className != className) element.className = className;\n      dom.setStyle(\n        cell.element.style,\n        \"height\",\n        this.$lines.computeLineHeight(row, config, session) + \"px\",\n      );\n      dom.setStyle(\n        cell.element.style,\n        \"top\",\n        this.$lines.computeLineTop(row, config, session) + \"px\",\n      );\n      cell.text = rowText;\n      if (\n        annotationNode.style.display === \"none\" &&\n        foldWidget.style.display === \"none\"\n      )\n        cell.element.setAttribute(\"aria-hidden\", true);\n      else cell.element.setAttribute(\"aria-hidden\", false);\n      return cell;\n    };\n    Gutter.prototype.setHighlightGutterLine = function (highlightGutterLine) {\n      this.$highlightGutterLine = highlightGutterLine;\n    };\n    Gutter.prototype.setShowLineNumbers = function (show) {\n      this.$renderer = !show && {\n        getWidth: function () {\n          return 0;\n        },\n        getText: function () {\n          return \"\";\n        },\n      };\n    };\n    Gutter.prototype.getShowLineNumbers = function () {\n      return this.$showLineNumbers;\n    };\n    Gutter.prototype.setShowFoldWidgets = function (show) {\n      if (show) dom.addCssClass(this.element, \"ace_folding-enabled\");\n      else dom.removeCssClass(this.element, \"ace_folding-enabled\");\n      this.$showFoldWidgets = show;\n      this.$padding = null;\n    };\n    Gutter.prototype.getShowFoldWidgets = function () {\n      return this.$showFoldWidgets;\n    };\n    Gutter.prototype.$computePadding = function () {\n      if (!this.element.firstChild) return { left: 0, right: 0 };\n      var style = dom.computedStyle(\n        /**@type{Element}*/ (this.element.firstChild),\n      );\n      this.$padding = {};\n      this.$padding.left =\n        (parseInt(style.borderLeftWidth) || 0) +\n        (parseInt(style.paddingLeft) || 0) +\n        1;\n      this.$padding.right =\n        (parseInt(style.borderRightWidth) || 0) +\n        (parseInt(style.paddingRight) || 0);\n      return this.$padding;\n    };\n    Gutter.prototype.getRegion = function (point) {\n      var padding = this.$padding || this.$computePadding();\n      var rect = this.element.getBoundingClientRect();\n      if (point.x < padding.left + rect.left) return \"markers\";\n      if (this.$showFoldWidgets && point.x > rect.right - padding.right)\n        return \"foldWidgets\";\n    };\n    return Gutter;\n  })();\n  Gutter.prototype.$fixedWidth = false;\n  Gutter.prototype.$highlightGutterLine = true;\n  Gutter.prototype.$renderer = \"\";\n  Gutter.prototype.$showLineNumbers = true;\n  Gutter.prototype.$showFoldWidgets = true;\n  oop.implement(Gutter.prototype, EventEmitter);\n  function onCreateCell(element) {\n    var textNode = document.createTextNode(\"\");\n    element.appendChild(textNode);\n    var foldWidget = dom.createElement(\"span\");\n    element.appendChild(foldWidget);\n    var annotationNode = dom.createElement(\"span\");\n    element.appendChild(annotationNode);\n    var annotationIconNode = dom.createElement(\"span\");\n    annotationNode.appendChild(annotationIconNode);\n    return element;\n  }\n  exports.Gutter = Gutter;\n});\n\ndefine(\"ace/layer/marker\", [\n  \"require\",\n  \"exports\",\n  \"module\",\n  \"ace/range\",\n  \"ace/lib/dom\",\n], function (require, exports, module) {\n  \"use strict\";\n  var Range = require(\"../range\").Range;\n  var dom = require(\"../lib/dom\");\n  var Marker = /** @class */ (function () {\n    function Marker(parentEl) {\n      this.element = dom.createElement(\"div\");\n      this.element.className = \"ace_layer ace_marker-layer\";\n      parentEl.appendChild(this.element);\n    }\n    Marker.prototype.setPadding = function (padding) {\n      this.$padding = padding;\n    };\n    Marker.prototype.setSession = function (session) {\n      this.session = session;\n    };\n    Marker.prototype.setMarkers = function (markers) {\n      this.markers = markers;\n    };\n    Marker.prototype.elt = function (className, css) {\n      var x = this.i != -1 && this.element.childNodes[this.i];\n      if (!x) {\n        x = document.createElement(\"div\");\n        this.element.appendChild(x);\n        this.i = -1;\n      } else {\n        this.i++;\n      }\n      x.style.cssText = css;\n      x.className = className;\n    };\n    Marker.prototype.update = function (config) {\n      if (!config) return;\n      this.config = config;\n      this.i = 0;\n      var html;\n      for (var key in this.markers) {\n        var marker = this.markers[key];\n        if (!marker.range) {\n          marker.update(html, this, this.session, config);\n          continue;\n        }\n        var range = marker.range.clipRows(config.firstRow, config.lastRow);\n        if (range.isEmpty()) continue;\n        range = range.toScreenRange(this.session);\n        if (marker.renderer) {\n          var top = this.$getTop(range.start.row, config);\n          var left = this.$padding + range.start.column * config.characterWidth;\n          marker.renderer(html, range, left, top, config);\n        } else if (marker.type == \"fullLine\") {\n          this.drawFullLineMarker(html, range, marker.clazz, config);\n        } else if (marker.type == \"screenLine\") {\n          this.drawScreenLineMarker(html, range, marker.clazz, config);\n        } else if (range.isMultiLine()) {\n          if (marker.type == \"text\")\n            this.drawTextMarker(html, range, marker.clazz, config);\n          else this.drawMultiLineMarker(html, range, marker.clazz, config);\n        } else {\n          this.drawSingleLineMarker(\n            html,\n            range,\n            marker.clazz + \" ace_start\" + \" ace_br15\",\n            config,\n          );\n        }\n      }\n      if (this.i != -1) {\n        while (this.i < this.element.childElementCount)\n          this.element.removeChild(this.element.lastChild);\n      }\n    };\n    Marker.prototype.$getTop = function (row, layerConfig) {\n      return (row - layerConfig.firstRowScreen) * layerConfig.lineHeight;\n    };\n    Marker.prototype.drawTextMarker = function (\n      stringBuilder,\n      range,\n      clazz,\n      layerConfig,\n      extraStyle,\n    ) {\n      var session = this.session;\n      var start = range.start.row;\n      var end = range.end.row;\n      var row = start;\n      var prev = 0;\n      var curr = 0;\n      var next = session.getScreenLastRowColumn(row);\n      var lineRange = new Range(row, range.start.column, row, curr);\n      for (; row <= end; row++) {\n        lineRange.start.row = lineRange.end.row = row;\n        lineRange.start.column =\n          row == start ? range.start.column : session.getRowWrapIndent(row);\n        lineRange.end.column = next;\n        prev = curr;\n        curr = next;\n        next =\n          row + 1 < end\n            ? session.getScreenLastRowColumn(row + 1)\n            : row == end\n              ? 0\n              : range.end.column;\n        this.drawSingleLineMarker(\n          stringBuilder,\n          lineRange,\n          clazz +\n            (row == start ? \" ace_start\" : \"\") +\n            \" ace_br\" +\n            getBorderClass(\n              row == start || (row == start + 1 && range.start.column),\n              prev < curr,\n              curr > next,\n              row == end,\n            ),\n          layerConfig,\n          row == end ? 0 : 1,\n          extraStyle,\n        );\n      }\n    };\n    Marker.prototype.drawMultiLineMarker = function (\n      stringBuilder,\n      range,\n      clazz,\n      config,\n      extraStyle,\n    ) {\n      var padding = this.$padding;\n      var height = config.lineHeight;\n      var top = this.$getTop(range.start.row, config);\n      var left = padding + range.start.column * config.characterWidth;\n      extraStyle = extraStyle || \"\";\n      if (this.session.$bidiHandler.isBidiRow(range.start.row)) {\n        var range1 = range.clone();\n        range1.end.row = range1.start.row;\n        range1.end.column = this.session.getLine(range1.start.row).length;\n        this.drawBidiSingleLineMarker(\n          stringBuilder,\n          range1,\n          clazz + \" ace_br1 ace_start\",\n          config,\n          null,\n          extraStyle,\n        );\n      } else {\n        this.elt(\n          clazz + \" ace_br1 ace_start\",\n          \"height:\" +\n            height +\n            \"px;\" +\n            \"right:0;\" +\n            \"top:\" +\n            top +\n            \"px;left:\" +\n            left +\n            \"px;\" +\n            (extraStyle || \"\"),\n        );\n      }\n      if (this.session.$bidiHandler.isBidiRow(range.end.row)) {\n        var range1 = range.clone();\n        range1.start.row = range1.end.row;\n        range1.start.column = 0;\n        this.drawBidiSingleLineMarker(\n          stringBuilder,\n          range1,\n          clazz + \" ace_br12\",\n          config,\n          null,\n          extraStyle,\n        );\n      } else {\n        top = this.$getTop(range.end.row, config);\n        var width = range.end.column * config.characterWidth;\n        this.elt(\n          clazz + \" ace_br12\",\n          \"height:\" +\n            height +\n            \"px;\" +\n            \"width:\" +\n            width +\n            \"px;\" +\n            \"top:\" +\n            top +\n            \"px;\" +\n            \"left:\" +\n            padding +\n            \"px;\" +\n            (extraStyle || \"\"),\n        );\n      }\n      height = (range.end.row - range.start.row - 1) * config.lineHeight;\n      if (height <= 0) return;\n      top = this.$getTop(range.start.row + 1, config);\n      var radiusClass =\n        (range.start.column ? 1 : 0) | (range.end.column ? 0 : 8);\n      this.elt(\n        clazz + (radiusClass ? \" ace_br\" + radiusClass : \"\"),\n        \"height:\" +\n          height +\n          \"px;\" +\n          \"right:0;\" +\n          \"top:\" +\n          top +\n          \"px;\" +\n          \"left:\" +\n          padding +\n          \"px;\" +\n          (extraStyle || \"\"),\n      );\n    };\n    Marker.prototype.drawSingleLineMarker = function (\n      stringBuilder,\n      range,\n      clazz,\n      config,\n      extraLength,\n      extraStyle,\n    ) {\n      if (this.session.$bidiHandler.isBidiRow(range.start.row))\n        return this.drawBidiSingleLineMarker(\n          stringBuilder,\n          range,\n          clazz,\n          config,\n          extraLength,\n          extraStyle,\n        );\n      var height = config.lineHeight;\n      var width =\n        (range.end.column + (extraLength || 0) - range.start.column) *\n        config.characterWidth;\n      var top = this.$getTop(range.start.row, config);\n      var left = this.$padding + range.start.column * config.characterWidth;\n      this.elt(\n        clazz,\n        \"height:\" +\n          height +\n          \"px;\" +\n          \"width:\" +\n          width +\n          \"px;\" +\n          \"top:\" +\n          top +\n          \"px;\" +\n          \"left:\" +\n          left +\n          \"px;\" +\n          (extraStyle || \"\"),\n      );\n    };\n    Marker.prototype.drawBidiSingleLineMarker = function (\n      stringBuilder,\n      range,\n      clazz,\n      config,\n      extraLength,\n      extraStyle,\n    ) {\n      var height = config.lineHeight,\n        top = this.$getTop(range.start.row, config),\n        padding = this.$padding;\n      var selections = this.session.$bidiHandler.getSelections(\n        range.start.column,\n        range.end.column,\n      );\n      selections.forEach(function (selection) {\n        this.elt(\n          clazz,\n          \"height:\" +\n            height +\n            \"px;\" +\n            \"width:\" +\n            (selection.width + (extraLength || 0)) +\n            \"px;\" +\n            \"top:\" +\n            top +\n            \"px;\" +\n            \"left:\" +\n            (padding + selection.left) +\n            \"px;\" +\n            (extraStyle || \"\"),\n        );\n      }, this);\n    };\n    Marker.prototype.drawFullLineMarker = function (\n      stringBuilder,\n      range,\n      clazz,\n      config,\n      extraStyle,\n    ) {\n      var top = this.$getTop(range.start.row, config);\n      var height = config.lineHeight;\n      if (range.start.row != range.end.row)\n        height += this.$getTop(range.end.row, config) - top;\n      this.elt(\n        clazz,\n        \"height:\" +\n          height +\n          \"px;\" +\n          \"top:\" +\n          top +\n          \"px;\" +\n          \"left:0;right:0;\" +\n          (extraStyle || \"\"),\n      );\n    };\n    Marker.prototype.drawScreenLineMarker = function (\n      stringBuilder,\n      range,\n      clazz,\n      config,\n      extraStyle,\n    ) {\n      var top = this.$getTop(range.start.row, config);\n      var height = config.lineHeight;\n      this.elt(\n        clazz,\n        \"height:\" +\n          height +\n          \"px;\" +\n          \"top:\" +\n          top +\n          \"px;\" +\n          \"left:0;right:0;\" +\n          (extraStyle || \"\"),\n      );\n    };\n    return Marker;\n  })();\n  Marker.prototype.$padding = 0;\n  function getBorderClass(tl, tr, br, bl) {\n    return (tl ? 1 : 0) | (tr ? 2 : 0) | (br ? 4 : 0) | (bl ? 8 : 0);\n  }\n  exports.Marker = Marker;\n});\n\ndefine(\"ace/layer/text_util\", [\"require\", \"exports\", \"module\"], function (\n  require,\n  exports,\n  module,\n) {\n  // Tokens for which Ace just uses a simple TextNode and does not add any special className.\n  var textTokens = new Set([\"text\", \"rparen\", \"lparen\"]);\n  exports.isTextToken = function (tokenType) {\n    return textTokens.has(tokenType);\n  };\n});\n\ndefine(\"ace/layer/text\", [\n  \"require\",\n  \"exports\",\n  \"module\",\n  \"ace/lib/oop\",\n  \"ace/lib/dom\",\n  \"ace/lib/lang\",\n  \"ace/layer/lines\",\n  \"ace/lib/event_emitter\",\n  \"ace/config\",\n  \"ace/layer/text_util\",\n], function (require, exports, module) {\n  \"use strict\";\n  var oop = require(\"../lib/oop\");\n  var dom = require(\"../lib/dom\");\n  var lang = require(\"../lib/lang\");\n  var Lines = require(\"./lines\").Lines;\n  var EventEmitter = require(\"../lib/event_emitter\").EventEmitter;\n  var nls = require(\"../config\").nls;\n  var isTextToken = require(\"./text_util\").isTextToken;\n  var Text = /** @class */ (function () {\n    function Text(parentEl) {\n      this.dom = dom;\n      this.element = this.dom.createElement(\"div\");\n      this.element.className = \"ace_layer ace_text-layer\";\n      parentEl.appendChild(this.element);\n      this.$updateEolChar = this.$updateEolChar.bind(this);\n      this.$lines = new Lines(this.element);\n    }\n    Text.prototype.$updateEolChar = function () {\n      var doc = this.session.doc;\n      var unixMode =\n        doc.getNewLineCharacter() == \"\\n\" && doc.getNewLineMode() != \"windows\";\n      var EOL_CHAR = unixMode ? this.EOL_CHAR_LF : this.EOL_CHAR_CRLF;\n      if (this.EOL_CHAR != EOL_CHAR) {\n        this.EOL_CHAR = EOL_CHAR;\n        return true;\n      }\n    };\n    Text.prototype.setPadding = function (padding) {\n      this.$padding = padding;\n      this.element.style.margin = \"0 \" + padding + \"px\";\n    };\n    Text.prototype.getLineHeight = function () {\n      return this.$fontMetrics.$characterSize.height || 0;\n    };\n    Text.prototype.getCharacterWidth = function () {\n      return this.$fontMetrics.$characterSize.width || 0;\n    };\n    Text.prototype.$setFontMetrics = function (measure) {\n      this.$fontMetrics = measure;\n      this.$fontMetrics.on(\n        \"changeCharacterSize\",\n        function (e) {\n          this._signal(\"changeCharacterSize\", e);\n        }.bind(this),\n      );\n      this.$pollSizeChanges();\n    };\n    Text.prototype.checkForSizeChanges = function () {\n      this.$fontMetrics.checkForSizeChanges();\n    };\n    Text.prototype.$pollSizeChanges = function () {\n      return (this.$pollSizeChangesTimer =\n        this.$fontMetrics.$pollSizeChanges());\n    };\n    Text.prototype.setSession = function (session) {\n      this.session = session;\n      if (session) this.$computeTabString();\n    };\n    Text.prototype.setShowInvisibles = function (showInvisibles) {\n      if (this.showInvisibles == showInvisibles) return false;\n      this.showInvisibles = showInvisibles;\n      if (typeof showInvisibles == \"string\") {\n        this.showSpaces = /tab/i.test(showInvisibles);\n        this.showTabs = /space/i.test(showInvisibles);\n        this.showEOL = /eol/i.test(showInvisibles);\n      } else {\n        this.showSpaces = this.showTabs = this.showEOL = showInvisibles;\n      }\n      this.$computeTabString();\n      return true;\n    };\n    Text.prototype.setDisplayIndentGuides = function (display) {\n      if (this.displayIndentGuides == display) return false;\n      this.displayIndentGuides = display;\n      this.$computeTabString();\n      return true;\n    };\n    Text.prototype.setHighlightIndentGuides = function (highlight) {\n      if (this.$highlightIndentGuides === highlight) return false;\n      this.$highlightIndentGuides = highlight;\n      return highlight;\n    };\n    Text.prototype.$computeTabString = function () {\n      var tabSize = this.session.getTabSize();\n      this.tabSize = tabSize;\n      var tabStr = (this.$tabStrings = [0]);\n      for (var i = 1; i < tabSize + 1; i++) {\n        if (this.showTabs) {\n          var span = this.dom.createElement(\"span\");\n          span.className = \"ace_invisible ace_invisible_tab\";\n          span.textContent = lang.stringRepeat(this.TAB_CHAR, i);\n          tabStr.push(span);\n        } else {\n          tabStr.push(\n            this.dom.createTextNode(lang.stringRepeat(\" \", i), this.element),\n          );\n        }\n      }\n      if (this.displayIndentGuides) {\n        this.$indentGuideRe = /\\s\\S| \\t|\\t |\\s$/;\n        var className = \"ace_indent-guide\";\n        var spaceClass = this.showSpaces\n          ? \" ace_invisible ace_invisible_space\"\n          : \"\";\n        var spaceContent = this.showSpaces\n          ? lang.stringRepeat(this.SPACE_CHAR, this.tabSize)\n          : lang.stringRepeat(\" \", this.tabSize);\n        var tabClass = this.showTabs ? \" ace_invisible ace_invisible_tab\" : \"\";\n        var tabContent = this.showTabs\n          ? lang.stringRepeat(this.TAB_CHAR, this.tabSize)\n          : spaceContent;\n        var span = this.dom.createElement(\"span\");\n        span.className = className + spaceClass;\n        span.textContent = spaceContent;\n        this.$tabStrings[\" \"] = span;\n        var span = this.dom.createElement(\"span\");\n        span.className = className + tabClass;\n        span.textContent = tabContent;\n        this.$tabStrings[\"\\t\"] = span;\n      }\n    };\n    Text.prototype.updateLines = function (config, firstRow, lastRow) {\n      if (\n        this.config.lastRow != config.lastRow ||\n        this.config.firstRow != config.firstRow\n      ) {\n        return this.update(config);\n      }\n      this.config = config;\n      var first = Math.max(firstRow, config.firstRow);\n      var last = Math.min(lastRow, config.lastRow);\n      var lineElements = this.element.childNodes;\n      var lineElementsIdx = 0;\n      for (var row = config.firstRow; row < first; row++) {\n        var foldLine = this.session.getFoldLine(row);\n        if (foldLine) {\n          if (foldLine.containsRow(first)) {\n            first = foldLine.start.row;\n            break;\n          } else {\n            row = foldLine.end.row;\n          }\n        }\n        lineElementsIdx++;\n      }\n      var heightChanged = false;\n      var row = first;\n      var foldLine = this.session.getNextFoldLine(row);\n      var foldStart = foldLine ? foldLine.start.row : Infinity;\n      while (true) {\n        if (row > foldStart) {\n          row = foldLine.end.row + 1;\n          foldLine = this.session.getNextFoldLine(row, foldLine);\n          foldStart = foldLine ? foldLine.start.row : Infinity;\n        }\n        if (row > last) break;\n        var lineElement = lineElements[lineElementsIdx++];\n        if (lineElement) {\n          this.dom.removeChildren(lineElement);\n          this.$renderLine(\n            lineElement,\n            row,\n            row == foldStart ? foldLine : false,\n          );\n          if (heightChanged)\n            lineElement.style.top =\n              this.$lines.computeLineTop(row, config, this.session) + \"px\";\n          var height =\n            config.lineHeight * this.session.getRowLength(row) + \"px\";\n          if (lineElement.style.height != height) {\n            heightChanged = true;\n            lineElement.style.height = height;\n          }\n        }\n        row++;\n      }\n      if (heightChanged) {\n        while (lineElementsIdx < this.$lines.cells.length) {\n          var cell = this.$lines.cells[lineElementsIdx++];\n          cell.element.style.top =\n            this.$lines.computeLineTop(cell.row, config, this.session) + \"px\";\n        }\n      }\n    };\n    Text.prototype.scrollLines = function (config) {\n      var oldConfig = this.config;\n      this.config = config;\n      if (this.$lines.pageChanged(oldConfig, config))\n        return this.update(config);\n      this.$lines.moveContainer(config);\n      var lastRow = config.lastRow;\n      var oldLastRow = oldConfig ? oldConfig.lastRow : -1;\n      if (!oldConfig || oldLastRow < config.firstRow)\n        return this.update(config);\n      if (lastRow < oldConfig.firstRow) return this.update(config);\n      if (!oldConfig || oldConfig.lastRow < config.firstRow)\n        return this.update(config);\n      if (config.lastRow < oldConfig.firstRow) return this.update(config);\n      if (oldConfig.firstRow < config.firstRow)\n        for (\n          var row = this.session.getFoldedRowCount(\n            oldConfig.firstRow,\n            config.firstRow - 1,\n          );\n          row > 0;\n          row--\n        )\n          this.$lines.shift();\n      if (oldConfig.lastRow > config.lastRow)\n        for (\n          var row = this.session.getFoldedRowCount(\n            config.lastRow + 1,\n            oldConfig.lastRow,\n          );\n          row > 0;\n          row--\n        )\n          this.$lines.pop();\n      if (config.firstRow < oldConfig.firstRow) {\n        this.$lines.unshift(\n          this.$renderLinesFragment(\n            config,\n            config.firstRow,\n            oldConfig.firstRow - 1,\n          ),\n        );\n      }\n      if (config.lastRow > oldConfig.lastRow) {\n        this.$lines.push(\n          this.$renderLinesFragment(\n            config,\n            oldConfig.lastRow + 1,\n            config.lastRow,\n          ),\n        );\n      }\n      this.$highlightIndentGuide();\n    };\n    Text.prototype.$renderLinesFragment = function (config, firstRow, lastRow) {\n      var fragment = [];\n      var row = firstRow;\n      var foldLine = this.session.getNextFoldLine(row);\n      var foldStart = foldLine ? foldLine.start.row : Infinity;\n      while (true) {\n        if (row > foldStart) {\n          row = foldLine.end.row + 1;\n          foldLine = this.session.getNextFoldLine(row, foldLine);\n          foldStart = foldLine ? foldLine.start.row : Infinity;\n        }\n        if (row > lastRow) break;\n        var line = this.$lines.createCell(row, config, this.session);\n        var lineEl = line.element;\n        this.dom.removeChildren(lineEl);\n        dom.setStyle(\n          lineEl.style,\n          \"height\",\n          this.$lines.computeLineHeight(row, config, this.session) + \"px\",\n        );\n        dom.setStyle(\n          lineEl.style,\n          \"top\",\n          this.$lines.computeLineTop(row, config, this.session) + \"px\",\n        );\n        this.$renderLine(lineEl, row, row == foldStart ? foldLine : false);\n        if (this.$useLineGroups()) {\n          lineEl.className = \"ace_line_group\";\n        } else {\n          lineEl.className = \"ace_line\";\n        }\n        fragment.push(line);\n        row++;\n      }\n      return fragment;\n    };\n    Text.prototype.update = function (config) {\n      this.$lines.moveContainer(config);\n      this.config = config;\n      var firstRow = config.firstRow;\n      var lastRow = config.lastRow;\n      var lines = this.$lines;\n      while (lines.getLength()) lines.pop();\n      lines.push(this.$renderLinesFragment(config, firstRow, lastRow));\n    };\n    Text.prototype.$renderToken = function (\n      parent,\n      screenColumn,\n      token,\n      value,\n    ) {\n      var self = this;\n      var re =\n        /(\\t)|( +)|([\\x00-\\x1f\\x80-\\xa0\\xad\\u1680\\u180E\\u2000-\\u200f\\u2028\\u2029\\u202F\\u205F\\uFEFF\\uFFF9-\\uFFFC\\u2066\\u2067\\u2068\\u202A\\u202B\\u202D\\u202E\\u202C\\u2069]+)|(\\u3000)|([\\u1100-\\u115F\\u11A3-\\u11A7\\u11FA-\\u11FF\\u2329-\\u232A\\u2E80-\\u2E99\\u2E9B-\\u2EF3\\u2F00-\\u2FD5\\u2FF0-\\u2FFB\\u3001-\\u303E\\u3041-\\u3096\\u3099-\\u30FF\\u3105-\\u312D\\u3131-\\u318E\\u3190-\\u31BA\\u31C0-\\u31E3\\u31F0-\\u321E\\u3220-\\u3247\\u3250-\\u32FE\\u3300-\\u4DBF\\u4E00-\\uA48C\\uA490-\\uA4C6\\uA960-\\uA97C\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFAFF\\uFE10-\\uFE19\\uFE30-\\uFE52\\uFE54-\\uFE66\\uFE68-\\uFE6B\\uFF01-\\uFF60\\uFFE0-\\uFFE6]|[\\uD800-\\uDBFF][\\uDC00-\\uDFFF])/g;\n      var valueFragment = this.dom.createFragment(this.element);\n      var m;\n      var i = 0;\n      while ((m = re.exec(value))) {\n        var tab = m[1];\n        var simpleSpace = m[2];\n        var controlCharacter = m[3];\n        var cjkSpace = m[4];\n        var cjk = m[5];\n        if (!self.showSpaces && simpleSpace) continue;\n        var before = i != m.index ? value.slice(i, m.index) : \"\";\n        i = m.index + m[0].length;\n        if (before) {\n          valueFragment.appendChild(\n            this.dom.createTextNode(before, this.element),\n          );\n        }\n        if (tab) {\n          var tabSize = self.session.getScreenTabSize(screenColumn + m.index);\n          valueFragment.appendChild(self.$tabStrings[tabSize].cloneNode(true));\n          screenColumn += tabSize - 1;\n        } else if (simpleSpace) {\n          if (self.showSpaces) {\n            var span = this.dom.createElement(\"span\");\n            span.className = \"ace_invisible ace_invisible_space\";\n            span.textContent = lang.stringRepeat(\n              self.SPACE_CHAR,\n              simpleSpace.length,\n            );\n            valueFragment.appendChild(span);\n          } else {\n            valueFragment.appendChild(\n              this.dom.createTextNode(simpleSpace, this.element),\n            );\n          }\n        } else if (controlCharacter) {\n          var span = this.dom.createElement(\"span\");\n          span.className = \"ace_invisible ace_invisible_space ace_invalid\";\n          span.textContent = lang.stringRepeat(\n            self.SPACE_CHAR,\n            controlCharacter.length,\n          );\n          valueFragment.appendChild(span);\n        } else if (cjkSpace) {\n          screenColumn += 1;\n          var span = this.dom.createElement(\"span\");\n          span.style.width = self.config.characterWidth * 2 + \"px\";\n          span.className = self.showSpaces\n            ? \"ace_cjk ace_invisible ace_invisible_space\"\n            : \"ace_cjk\";\n          span.textContent = self.showSpaces ? self.SPACE_CHAR : cjkSpace;\n          valueFragment.appendChild(span);\n        } else if (cjk) {\n          screenColumn += 1;\n          var span = this.dom.createElement(\"span\");\n          span.style.width = self.config.characterWidth * 2 + \"px\";\n          span.className = \"ace_cjk\";\n          span.textContent = cjk;\n          valueFragment.appendChild(span);\n        }\n      }\n      valueFragment.appendChild(\n        this.dom.createTextNode(i ? value.slice(i) : value, this.element),\n      );\n      if (!isTextToken(token.type)) {\n        var classes = \"ace_\" + token.type.replace(/\\./g, \" ace_\");\n        var span = this.dom.createElement(\"span\");\n        if (token.type == \"fold\") {\n          span.style.width =\n            token.value.length * this.config.characterWidth + \"px\";\n          span.setAttribute(\"title\", nls(\"Unfold code\"));\n        }\n        span.className = classes;\n        span.appendChild(valueFragment);\n        parent.appendChild(span);\n      } else {\n        parent.appendChild(valueFragment);\n      }\n      return screenColumn + value.length;\n    };\n    Text.prototype.renderIndentGuide = function (parent, value, max) {\n      var cols = value.search(this.$indentGuideRe);\n      if (cols <= 0 || cols >= max) return value;\n      if (value[0] == \" \") {\n        cols -= cols % this.tabSize;\n        var count = cols / this.tabSize;\n        for (var i = 0; i < count; i++) {\n          parent.appendChild(this.$tabStrings[\" \"].cloneNode(true));\n        }\n        this.$highlightIndentGuide();\n        return value.substr(cols);\n      } else if (value[0] == \"\\t\") {\n        for (var i = 0; i < cols; i++) {\n          parent.appendChild(this.$tabStrings[\"\\t\"].cloneNode(true));\n        }\n        this.$highlightIndentGuide();\n        return value.substr(cols);\n      }\n      this.$highlightIndentGuide();\n      return value;\n    };\n    Text.prototype.$highlightIndentGuide = function () {\n      if (!this.$highlightIndentGuides || !this.displayIndentGuides) return;\n      this.$highlightIndentGuideMarker = {\n        indentLevel: undefined,\n        start: undefined,\n        end: undefined,\n        dir: undefined,\n      };\n      var lines = this.session.doc.$lines;\n      if (!lines) return;\n      var cursor = this.session.selection.getCursor();\n      var initialIndent = /^\\s*/.exec(this.session.doc.getLine(cursor.row))[0]\n        .length;\n      var elementIndentLevel = Math.floor(initialIndent / this.tabSize);\n      this.$highlightIndentGuideMarker = {\n        indentLevel: elementIndentLevel,\n        start: cursor.row,\n      };\n      var bracketHighlight = this.session.$bracketHighlight;\n      if (bracketHighlight) {\n        var ranges = this.session.$bracketHighlight.ranges;\n        for (var i = 0; i < ranges.length; i++) {\n          if (cursor.row !== ranges[i].start.row) {\n            this.$highlightIndentGuideMarker.end = ranges[i].start.row;\n            if (cursor.row > ranges[i].start.row) {\n              this.$highlightIndentGuideMarker.dir = -1;\n            } else {\n              this.$highlightIndentGuideMarker.dir = 1;\n            }\n            break;\n          }\n        }\n      }\n      if (!this.$highlightIndentGuideMarker.end) {\n        if (\n          lines[cursor.row] !== \"\" &&\n          cursor.column === lines[cursor.row].length\n        ) {\n          this.$highlightIndentGuideMarker.dir = 1;\n          for (var i = cursor.row + 1; i < lines.length; i++) {\n            var line = lines[i];\n            var currentIndent = /^\\s*/.exec(line)[0].length;\n            if (line !== \"\") {\n              this.$highlightIndentGuideMarker.end = i;\n              if (currentIndent <= initialIndent) break;\n            }\n          }\n        }\n      }\n      this.$renderHighlightIndentGuide();\n    };\n    Text.prototype.$clearActiveIndentGuide = function () {\n      var cells = this.$lines.cells;\n      for (var i = 0; i < cells.length; i++) {\n        var cell = cells[i];\n        var childNodes = cell.element.childNodes;\n        if (childNodes.length > 0) {\n          for (var j = 0; j < childNodes.length; j++) {\n            if (\n              childNodes[j].classList &&\n              childNodes[j].classList.contains(\"ace_indent-guide-active\")\n            ) {\n              childNodes[j].classList.remove(\"ace_indent-guide-active\");\n              break;\n            }\n          }\n        }\n      }\n    };\n    Text.prototype.$setIndentGuideActive = function (cell, indentLevel) {\n      var line = this.session.doc.getLine(cell.row);\n      if (line !== \"\") {\n        var childNodes = cell.element.childNodes;\n        if (childNodes) {\n          var node = childNodes[indentLevel - 1];\n          if (\n            node &&\n            node.classList &&\n            node.classList.contains(\"ace_indent-guide\")\n          )\n            node.classList.add(\"ace_indent-guide-active\");\n        }\n      }\n    };\n    Text.prototype.$renderHighlightIndentGuide = function () {\n      if (!this.$lines) return;\n      var cells = this.$lines.cells;\n      this.$clearActiveIndentGuide();\n      var indentLevel = this.$highlightIndentGuideMarker.indentLevel;\n      if (indentLevel !== 0) {\n        if (this.$highlightIndentGuideMarker.dir === 1) {\n          for (var i = 0; i < cells.length; i++) {\n            var cell = cells[i];\n            if (\n              this.$highlightIndentGuideMarker.end &&\n              cell.row >= this.$highlightIndentGuideMarker.start + 1\n            ) {\n              if (cell.row >= this.$highlightIndentGuideMarker.end) break;\n              this.$setIndentGuideActive(cell, indentLevel);\n            }\n          }\n        } else {\n          for (var i = cells.length - 1; i >= 0; i--) {\n            var cell = cells[i];\n            if (\n              this.$highlightIndentGuideMarker.end &&\n              cell.row < this.$highlightIndentGuideMarker.start\n            ) {\n              if (cell.row <= this.$highlightIndentGuideMarker.end) break;\n              this.$setIndentGuideActive(cell, indentLevel);\n            }\n          }\n        }\n      }\n    };\n    Text.prototype.$createLineElement = function (parent) {\n      var lineEl = this.dom.createElement(\"div\");\n      lineEl.className = \"ace_line\";\n      lineEl.style.height = this.config.lineHeight + \"px\";\n      return lineEl;\n    };\n    Text.prototype.$renderWrappedLine = function (parent, tokens, splits) {\n      var chars = 0;\n      var split = 0;\n      var splitChars = splits[0];\n      var screenColumn = 0;\n      var lineEl = this.$createLineElement();\n      parent.appendChild(lineEl);\n      for (var i = 0; i < tokens.length; i++) {\n        var token = tokens[i];\n        var value = token.value;\n        if (i == 0 && this.displayIndentGuides) {\n          chars = value.length;\n          value = this.renderIndentGuide(lineEl, value, splitChars);\n          if (!value) continue;\n          chars -= value.length;\n        }\n        if (chars + value.length < splitChars) {\n          screenColumn = this.$renderToken(lineEl, screenColumn, token, value);\n          chars += value.length;\n        } else {\n          while (chars + value.length >= splitChars) {\n            screenColumn = this.$renderToken(\n              lineEl,\n              screenColumn,\n              token,\n              value.substring(0, splitChars - chars),\n            );\n            value = value.substring(splitChars - chars);\n            chars = splitChars;\n            lineEl = this.$createLineElement();\n            parent.appendChild(lineEl);\n            lineEl.appendChild(\n              this.dom.createTextNode(\n                lang.stringRepeat(\"\\xa0\", splits.indent),\n                this.element,\n              ),\n            );\n            split++;\n            screenColumn = 0;\n            splitChars = splits[split] || Number.MAX_VALUE;\n          }\n          if (value.length != 0) {\n            chars += value.length;\n            screenColumn = this.$renderToken(\n              lineEl,\n              screenColumn,\n              token,\n              value,\n            );\n          }\n        }\n      }\n      if (splits[splits.length - 1] > this.MAX_LINE_LENGTH)\n        this.$renderOverflowMessage(lineEl, screenColumn, null, \"\", true);\n    };\n    Text.prototype.$renderSimpleLine = function (parent, tokens) {\n      var screenColumn = 0;\n      for (var i = 0; i < tokens.length; i++) {\n        var token = tokens[i];\n        var value = token.value;\n        if (i == 0 && this.displayIndentGuides) {\n          value = this.renderIndentGuide(parent, value);\n          if (!value) continue;\n        }\n        if (screenColumn + value.length > this.MAX_LINE_LENGTH)\n          return this.$renderOverflowMessage(\n            parent,\n            screenColumn,\n            token,\n            value,\n          );\n        screenColumn = this.$renderToken(parent, screenColumn, token, value);\n      }\n    };\n    Text.prototype.$renderOverflowMessage = function (\n      parent,\n      screenColumn,\n      token,\n      value,\n      hide,\n    ) {\n      token &&\n        this.$renderToken(\n          parent,\n          screenColumn,\n          token,\n          value.slice(0, this.MAX_LINE_LENGTH - screenColumn),\n        );\n      var overflowEl = this.dom.createElement(\"span\");\n      overflowEl.className = \"ace_inline_button ace_keyword ace_toggle_wrap\";\n      overflowEl.textContent = hide ? \"<hide>\" : \"<click to see more...>\";\n      parent.appendChild(overflowEl);\n    };\n    Text.prototype.$renderLine = function (parent, row, foldLine) {\n      if (!foldLine && foldLine != false)\n        foldLine = this.session.getFoldLine(row);\n      if (foldLine) var tokens = this.$getFoldLineTokens(row, foldLine);\n      else var tokens = this.session.getTokens(row);\n      var lastLineEl = parent;\n      if (tokens.length) {\n        var splits = this.session.getRowSplitData(row);\n        if (splits && splits.length) {\n          this.$renderWrappedLine(parent, tokens, splits);\n          var lastLineEl = parent.lastChild;\n        } else {\n          var lastLineEl = parent;\n          if (this.$useLineGroups()) {\n            lastLineEl = this.$createLineElement();\n            parent.appendChild(lastLineEl);\n          }\n          this.$renderSimpleLine(lastLineEl, tokens);\n        }\n      } else if (this.$useLineGroups()) {\n        lastLineEl = this.$createLineElement();\n        parent.appendChild(lastLineEl);\n      }\n      if (this.showEOL && lastLineEl) {\n        if (foldLine) row = foldLine.end.row;\n        var invisibleEl = this.dom.createElement(\"span\");\n        invisibleEl.className = \"ace_invisible ace_invisible_eol\";\n        invisibleEl.textContent =\n          row == this.session.getLength() - 1 ? this.EOF_CHAR : this.EOL_CHAR;\n        lastLineEl.appendChild(invisibleEl);\n      }\n    };\n    Text.prototype.$getFoldLineTokens = function (row, foldLine) {\n      var session = this.session;\n      var renderTokens = [];\n      function addTokens(tokens, from, to) {\n        var idx = 0,\n          col = 0;\n        while (col + tokens[idx].value.length < from) {\n          col += tokens[idx].value.length;\n          idx++;\n          if (idx == tokens.length) return;\n        }\n        if (col != from) {\n          var value = tokens[idx].value.substring(from - col);\n          if (value.length > to - from) value = value.substring(0, to - from);\n          renderTokens.push({\n            type: tokens[idx].type,\n            value: value,\n          });\n          col = from + value.length;\n          idx += 1;\n        }\n        while (col < to && idx < tokens.length) {\n          var value = tokens[idx].value;\n          if (value.length + col > to) {\n            renderTokens.push({\n              type: tokens[idx].type,\n              value: value.substring(0, to - col),\n            });\n          } else renderTokens.push(tokens[idx]);\n          col += value.length;\n          idx += 1;\n        }\n      }\n      var tokens = session.getTokens(row);\n      foldLine.walk(\n        function (placeholder, row, column, lastColumn, isNewRow) {\n          if (placeholder != null) {\n            renderTokens.push({\n              type: \"fold\",\n              value: placeholder,\n            });\n          } else {\n            if (isNewRow) tokens = session.getTokens(row);\n            if (tokens.length) addTokens(tokens, lastColumn, column);\n          }\n        },\n        foldLine.end.row,\n        this.session.getLine(foldLine.end.row).length,\n      );\n      return renderTokens;\n    };\n    Text.prototype.$useLineGroups = function () {\n      return this.session.getUseWrapMode();\n    };\n    return Text;\n  })();\n  Text.prototype.EOF_CHAR = \"\\xB6\";\n  Text.prototype.EOL_CHAR_LF = \"\\xAC\";\n  Text.prototype.EOL_CHAR_CRLF = \"\\xa4\";\n  Text.prototype.EOL_CHAR = Text.prototype.EOL_CHAR_LF;\n  Text.prototype.TAB_CHAR = \"\\u2014\"; //\"\\u21E5\";\n  Text.prototype.SPACE_CHAR = \"\\xB7\";\n  Text.prototype.$padding = 0;\n  Text.prototype.MAX_LINE_LENGTH = 10000;\n  Text.prototype.showInvisibles = false;\n  Text.prototype.showSpaces = false;\n  Text.prototype.showTabs = false;\n  Text.prototype.showEOL = false;\n  Text.prototype.displayIndentGuides = true;\n  Text.prototype.$highlightIndentGuides = true;\n  Text.prototype.$tabStrings = [];\n  Text.prototype.destroy = {};\n  Text.prototype.onChangeTabSize = Text.prototype.$computeTabString;\n  oop.implement(Text.prototype, EventEmitter);\n  exports.Text = Text;\n});\n\ndefine(\"ace/layer/cursor\", [\n  \"require\",\n  \"exports\",\n  \"module\",\n  \"ace/lib/dom\",\n], function (require, exports, module) {\n  \"use strict\";\n  var dom = require(\"../lib/dom\");\n  var Cursor = /** @class */ (function () {\n    function Cursor(parentEl) {\n      this.element = dom.createElement(\"div\");\n      this.element.className = \"ace_layer ace_cursor-layer\";\n      parentEl.appendChild(this.element);\n      this.isVisible = false;\n      this.isBlinking = true;\n      this.blinkInterval = 1000;\n      this.smoothBlinking = false;\n      this.cursors = [];\n      this.cursor = this.addCursor();\n      dom.addCssClass(this.element, \"ace_hidden-cursors\");\n      this.$updateCursors = this.$updateOpacity.bind(this);\n    }\n    Cursor.prototype.$updateOpacity = function (val) {\n      var cursors = this.cursors;\n      for (var i = cursors.length; i--; )\n        dom.setStyle(cursors[i].style, \"opacity\", val ? \"\" : \"0\");\n    };\n    Cursor.prototype.$startCssAnimation = function () {\n      var cursors = this.cursors;\n      for (var i = cursors.length; i--; )\n        cursors[i].style.animationDuration = this.blinkInterval + \"ms\";\n      this.$isAnimating = true;\n      setTimeout(\n        function () {\n          if (this.$isAnimating) {\n            dom.addCssClass(this.element, \"ace_animate-blinking\");\n          }\n        }.bind(this),\n      );\n    };\n    Cursor.prototype.$stopCssAnimation = function () {\n      this.$isAnimating = false;\n      dom.removeCssClass(this.element, \"ace_animate-blinking\");\n    };\n    Cursor.prototype.setPadding = function (padding) {\n      this.$padding = padding;\n    };\n    Cursor.prototype.setSession = function (session) {\n      this.session = session;\n    };\n    Cursor.prototype.setBlinking = function (blinking) {\n      if (blinking != this.isBlinking) {\n        this.isBlinking = blinking;\n        this.restartTimer();\n      }\n    };\n    Cursor.prototype.setBlinkInterval = function (blinkInterval) {\n      if (blinkInterval != this.blinkInterval) {\n        this.blinkInterval = blinkInterval;\n        this.restartTimer();\n      }\n    };\n    Cursor.prototype.setSmoothBlinking = function (smoothBlinking) {\n      if (smoothBlinking != this.smoothBlinking) {\n        this.smoothBlinking = smoothBlinking;\n        dom.setCssClass(this.element, \"ace_smooth-blinking\", smoothBlinking);\n        this.$updateCursors(true);\n        this.restartTimer();\n      }\n    };\n    Cursor.prototype.addCursor = function () {\n      var el = dom.createElement(\"div\");\n      el.className = \"ace_cursor\";\n      this.element.appendChild(el);\n      this.cursors.push(el);\n      return el;\n    };\n    Cursor.prototype.removeCursor = function () {\n      if (this.cursors.length > 1) {\n        var el = this.cursors.pop();\n        el.parentNode.removeChild(el);\n        return el;\n      }\n    };\n    Cursor.prototype.hideCursor = function () {\n      this.isVisible = false;\n      dom.addCssClass(this.element, \"ace_hidden-cursors\");\n      this.restartTimer();\n    };\n    Cursor.prototype.showCursor = function () {\n      this.isVisible = true;\n      dom.removeCssClass(this.element, \"ace_hidden-cursors\");\n      this.restartTimer();\n    };\n    Cursor.prototype.restartTimer = function () {\n      var update = this.$updateCursors;\n      clearInterval(this.intervalId);\n      clearTimeout(this.timeoutId);\n      this.$stopCssAnimation();\n      if (this.smoothBlinking) {\n        this.$isSmoothBlinking = false;\n        dom.removeCssClass(this.element, \"ace_smooth-blinking\");\n      }\n      update(true);\n      if (!this.isBlinking || !this.blinkInterval || !this.isVisible) {\n        this.$stopCssAnimation();\n        return;\n      }\n      if (this.smoothBlinking) {\n        this.$isSmoothBlinking = true;\n        setTimeout(\n          function () {\n            if (this.$isSmoothBlinking) {\n              dom.addCssClass(this.element, \"ace_smooth-blinking\");\n            }\n          }.bind(this),\n        );\n      }\n      if (dom.HAS_CSS_ANIMATION) {\n        this.$startCssAnimation();\n      } else {\n        var blink = /**@this{Cursor}*/ function () {\n          this.timeoutId = setTimeout(function () {\n            update(false);\n          }, 0.6 * this.blinkInterval);\n        }.bind(this);\n        this.intervalId = setInterval(function () {\n          update(true);\n          blink();\n        }, this.blinkInterval);\n        blink();\n      }\n    };\n    Cursor.prototype.getPixelPosition = function (position, onScreen) {\n      if (!this.config || !this.session) return { left: 0, top: 0 };\n      if (!position) position = this.session.selection.getCursor();\n      var pos = this.session.documentToScreenPosition(position);\n      var cursorLeft =\n        this.$padding +\n        (this.session.$bidiHandler.isBidiRow(pos.row, position.row)\n          ? this.session.$bidiHandler.getPosLeft(pos.column)\n          : pos.column * this.config.characterWidth);\n      var cursorTop =\n        (pos.row - (onScreen ? this.config.firstRowScreen : 0)) *\n        this.config.lineHeight;\n      return { left: cursorLeft, top: cursorTop };\n    };\n    Cursor.prototype.isCursorInView = function (pixelPos, config) {\n      return pixelPos.top >= 0 && pixelPos.top < config.maxHeight;\n    };\n    Cursor.prototype.update = function (config) {\n      this.config = config;\n      var selections = this.session.$selectionMarkers;\n      var i = 0,\n        cursorIndex = 0;\n      if (selections === undefined || selections.length === 0) {\n        selections = [{ cursor: null }];\n      }\n      for (var i = 0, n = selections.length; i < n; i++) {\n        var pixelPos = this.getPixelPosition(selections[i].cursor, true);\n        if (\n          (pixelPos.top > config.height + config.offset || pixelPos.top < 0) &&\n          i > 1\n        ) {\n          continue;\n        }\n        var element = this.cursors[cursorIndex++] || this.addCursor();\n        var style = element.style;\n        if (!this.drawCursor) {\n          if (!this.isCursorInView(pixelPos, config)) {\n            dom.setStyle(style, \"display\", \"none\");\n          } else {\n            dom.setStyle(style, \"display\", \"block\");\n            dom.translate(element, pixelPos.left, pixelPos.top);\n            dom.setStyle(\n              style,\n              \"width\",\n              Math.round(config.characterWidth) + \"px\",\n            );\n            dom.setStyle(style, \"height\", config.lineHeight + \"px\");\n          }\n        } else {\n          this.drawCursor(\n            element,\n            pixelPos,\n            config,\n            selections[i],\n            this.session,\n          );\n        }\n      }\n      while (this.cursors.length > cursorIndex) this.removeCursor();\n      var overwrite = this.session.getOverwrite();\n      this.$setOverwrite(overwrite);\n      this.$pixelPos = pixelPos;\n      this.restartTimer();\n    };\n    Cursor.prototype.$setOverwrite = function (overwrite) {\n      if (overwrite != this.overwrite) {\n        this.overwrite = overwrite;\n        if (overwrite) dom.addCssClass(this.element, \"ace_overwrite-cursors\");\n        else dom.removeCssClass(this.element, \"ace_overwrite-cursors\");\n      }\n    };\n    Cursor.prototype.destroy = function () {\n      clearInterval(this.intervalId);\n      clearTimeout(this.timeoutId);\n    };\n    return Cursor;\n  })();\n  Cursor.prototype.$padding = 0;\n  Cursor.prototype.drawCursor = null;\n  exports.Cursor = Cursor;\n});\n\ndefine(\"ace/scrollbar\", [\n  \"require\",\n  \"exports\",\n  \"module\",\n  \"ace/lib/oop\",\n  \"ace/lib/dom\",\n  \"ace/lib/event\",\n  \"ace/lib/event_emitter\",\n], function (require, exports, module) {\n  \"use strict\";\n  var __extends =\n    (this && this.__extends) ||\n    (function () {\n      var extendStatics = function (d, b) {\n        extendStatics =\n          Object.setPrototypeOf ||\n          ({ __proto__: [] } instanceof Array &&\n            function (d, b) {\n              d.__proto__ = b;\n            }) ||\n          function (d, b) {\n            for (var p in b)\n              if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p];\n          };\n        return extendStatics(d, b);\n      };\n      return function (d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\n            \"Class extends value \" +\n              String(b) +\n              \" is not a constructor or null\",\n          );\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype =\n          b === null\n            ? Object.create(b)\n            : ((__.prototype = b.prototype), new __());\n      };\n    })();\n  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 MAX_SCROLL_H = 0x8000;\n  var Scrollbar = /** @class */ (function () {\n    function Scrollbar(parent, classSuffix) {\n      this.element = dom.createElement(\"div\");\n      this.element.className = \"ace_scrollbar ace_scrollbar\" + classSuffix;\n      this.inner = dom.createElement(\"div\");\n      this.inner.className = \"ace_scrollbar-inner\";\n      this.inner.textContent = \"\\xa0\";\n      this.element.appendChild(this.inner);\n      parent.appendChild(this.element);\n      this.setVisible(false);\n      this.skipEvent = false;\n      event.addListener(this.element, \"scroll\", this.onScroll.bind(this));\n      event.addListener(this.element, \"mousedown\", event.preventDefault);\n    }\n    Scrollbar.prototype.setVisible = function (isVisible) {\n      this.element.style.display = isVisible ? \"\" : \"none\";\n      this.isVisible = isVisible;\n      this.coeff = 1;\n    };\n    return Scrollbar;\n  })();\n  oop.implement(Scrollbar.prototype, EventEmitter);\n  var VScrollBar = /** @class */ (function (_super) {\n    __extends(VScrollBar, _super);\n    function VScrollBar(parent, renderer) {\n      var _this = _super.call(this, parent, \"-v\") || this;\n      _this.scrollTop = 0;\n      _this.scrollHeight = 0;\n      renderer.$scrollbarWidth = _this.width = dom.scrollbarWidth(\n        parent.ownerDocument,\n      );\n      _this.inner.style.width = _this.element.style.width =\n        (_this.width || 15) + 5 + \"px\";\n      _this.$minWidth = 0;\n      return _this;\n    }\n    VScrollBar.prototype.onScroll = function () {\n      if (!this.skipEvent) {\n        this.scrollTop = this.element.scrollTop;\n        if (this.coeff != 1) {\n          var h = this.element.clientHeight / this.scrollHeight;\n          this.scrollTop = (this.scrollTop * (1 - h)) / (this.coeff - h);\n        }\n        this._emit(\"scroll\", { data: this.scrollTop });\n      }\n      this.skipEvent = false;\n    };\n    VScrollBar.prototype.getWidth = function () {\n      return Math.max(this.isVisible ? this.width : 0, this.$minWidth || 0);\n    };\n    VScrollBar.prototype.setHeight = function (height) {\n      this.element.style.height = height + \"px\";\n    };\n    VScrollBar.prototype.setScrollHeight = function (height) {\n      this.scrollHeight = height;\n      if (height > MAX_SCROLL_H) {\n        this.coeff = MAX_SCROLL_H / height;\n        height = MAX_SCROLL_H;\n      } else if (this.coeff != 1) {\n        this.coeff = 1;\n      }\n      this.inner.style.height = height + \"px\";\n    };\n    VScrollBar.prototype.setScrollTop = function (scrollTop) {\n      if (this.scrollTop != scrollTop) {\n        this.skipEvent = true;\n        this.scrollTop = scrollTop;\n        this.element.scrollTop = scrollTop * this.coeff;\n      }\n    };\n    return VScrollBar;\n  })(Scrollbar);\n  VScrollBar.prototype.setInnerHeight = VScrollBar.prototype.setScrollHeight;\n  var HScrollBar = /** @class */ (function (_super) {\n    __extends(HScrollBar, _super);\n    function HScrollBar(parent, renderer) {\n      var _this = _super.call(this, parent, \"-h\") || this;\n      _this.scrollLeft = 0;\n      _this.height = renderer.$scrollbarWidth;\n      _this.inner.style.height = _this.element.style.height =\n        (_this.height || 15) + 5 + \"px\";\n      return _this;\n    }\n    HScrollBar.prototype.onScroll = 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    HScrollBar.prototype.getHeight = function () {\n      return this.isVisible ? this.height : 0;\n    };\n    HScrollBar.prototype.setWidth = function (width) {\n      this.element.style.width = width + \"px\";\n    };\n    HScrollBar.prototype.setInnerWidth = function (width) {\n      this.inner.style.width = width + \"px\";\n    };\n    HScrollBar.prototype.setScrollWidth = function (width) {\n      this.inner.style.width = width + \"px\";\n    };\n    HScrollBar.prototype.setScrollLeft = function (scrollLeft) {\n      if (this.scrollLeft != scrollLeft) {\n        this.skipEvent = true;\n        this.scrollLeft = this.element.scrollLeft = scrollLeft;\n      }\n    };\n    return HScrollBar;\n  })(Scrollbar);\n  exports.ScrollBar = VScrollBar; // backward compatibility\n  exports.ScrollBarV = VScrollBar; // backward compatibility\n  exports.ScrollBarH = HScrollBar; // backward compatibility\n  exports.VScrollBar = VScrollBar;\n  exports.HScrollBar = HScrollBar;\n});\n\ndefine(\"ace/scrollbar_custom\", [\n  \"require\",\n  \"exports\",\n  \"module\",\n  \"ace/lib/oop\",\n  \"ace/lib/dom\",\n  \"ace/lib/event\",\n  \"ace/lib/event_emitter\",\n], function (require, exports, module) {\n  \"use strict\";\n  var __extends =\n    (this && this.__extends) ||\n    (function () {\n      var extendStatics = function (d, b) {\n        extendStatics =\n          Object.setPrototypeOf ||\n          ({ __proto__: [] } instanceof Array &&\n            function (d, b) {\n              d.__proto__ = b;\n            }) ||\n          function (d, b) {\n            for (var p in b)\n              if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p];\n          };\n        return extendStatics(d, b);\n      };\n      return function (d, b) {\n        if (typeof b !== \"function\" && b !== null)\n          throw new TypeError(\n            \"Class extends value \" +\n              String(b) +\n              \" is not a constructor or null\",\n          );\n        extendStatics(d, b);\n        function __() {\n          this.constructor = d;\n        }\n        d.prototype =\n          b === null\n            ? Object.create(b)\n            : ((__.prototype = b.prototype), new __());\n      };\n    })();\n  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  dom.importCssString(\n    \".ace_editor>.ace_sb-v div, .ace_editor>.ace_sb-h div{\\n  position: absolute;\\n  background: rgba(128, 128, 128, 0.6);\\n  -moz-box-sizing: border-box;\\n  box-sizing: border-box;\\n  border: 1px solid #bbb;\\n  border-radius: 2px;\\n  z-index: 8;\\n}\\n.ace_editor>.ace_sb-v, .ace_editor>.ace_sb-h {\\n  position: absolute;\\n  z-index: 6;\\n  background: none;\\n  overflow: hidden!important;\\n}\\n.ace_editor>.ace_sb-v {\\n  z-index: 6;\\n  right: 0;\\n  top: 0;\\n  width: 12px;\\n}\\n.ace_editor>.ace_sb-v div {\\n  z-index: 8;\\n  right: 0;\\n  width: 100%;\\n}\\n.ace_editor>.ace_sb-h {\\n  bottom: 0;\\n  left: 0;\\n  height: 12px;\\n}\\n.ace_editor>.ace_sb-h div {\\n  bottom: 0;\\n  height: 100%;\\n}\\n.ace_editor>.ace_sb_grabbed {\\n  z-index: 8;\\n  background: #000;\\n}\",\n    \"ace_scrollbar.css\",\n    false,\n  );\n  var ScrollBar = /** @class */ (function () {\n    function ScrollBar(parent, classSuffix) {\n      this.element = dom.createElement(\"div\");\n      this.element.className = \"ace_sb\" + classSuffix;\n      this.inner = dom.createElement(\"div\");\n      this.inner.className = \"\";\n      this.element.appendChild(this.inner);\n      this.VScrollWidth = 12;\n      this.HScrollHeight = 12;\n      parent.appendChild(this.element);\n      this.setVisible(false);\n      this.skipEvent = false;\n      event.addMultiMouseDownListener(\n        this.element,\n        [500, 300, 300],\n        this,\n        \"onMouseDown\",\n      );\n    }\n    ScrollBar.prototype.setVisible = function (isVisible) {\n      this.element.style.display = isVisible ? \"\" : \"none\";\n      this.isVisible = isVisible;\n      this.coeff = 1;\n    };\n    return ScrollBar;\n  })();\n  oop.implement(ScrollBar.prototype, EventEmitter);\n  var VScrollBar = /** @class */ (function (_super) {\n    __extends(VScrollBar, _super);\n    function VScrollBar(parent, renderer) {\n      var _this = _super.call(this, parent, \"-v\") || this;\n      _this.scrollTop = 0;\n      _this.scrollHeight = 0;\n      _this.parent = parent;\n      _this.width = _this.VScrollWidth;\n      _this.renderer = renderer;\n      _this.inner.style.width = _this.element.style.width =\n        (_this.width || 15) + \"px\";\n      _this.$minWidth = 0;\n      return _this;\n    }\n    VScrollBar.prototype.onMouseDown = function (eType, e) {\n      if (eType !== \"mousedown\") return;\n      if (event.getButton(e) !== 0 || e.detail === 2) {\n        return;\n      }\n      if (e.target === this.inner) {\n        var self = this;\n        var mousePageY = e.clientY;\n        var onMouseMove = function (e) {\n          mousePageY = e.clientY;\n        };\n        var onMouseUp = function () {\n          clearInterval(timerId);\n        };\n        var startY = e.clientY;\n        var startTop = this.thumbTop;\n        var onScrollInterval = function () {\n          if (mousePageY === undefined) return;\n          var scrollTop = self.scrollTopFromThumbTop(\n            startTop + mousePageY - startY,\n          );\n          if (scrollTop === self.scrollTop) return;\n          self._emit(\"scroll\", { data: scrollTop });\n        };\n        event.capture(this.inner, onMouseMove, onMouseUp);\n        var timerId = setInterval(onScrollInterval, 20);\n        return event.preventDefault(e);\n      }\n      var top =\n        e.clientY -\n        this.element.getBoundingClientRect().top -\n        this.thumbHeight / 2;\n      this._emit(\"scroll\", { data: this.scrollTopFromThumbTop(top) });\n      return event.preventDefault(e);\n    };\n    VScrollBar.prototype.getHeight = function () {\n      return this.height;\n    };\n    VScrollBar.prototype.scrollTopFromThumbTop = function (thumbTop) {\n      var scrollTop =\n        (thumbTop * (this.pageHeight - this.viewHeight)) /\n        (this.slideHeight - this.thumbHeight);\n      scrollTop = scrollTop >> 0;\n      if (scrollTop < 0) {\n        scrollTop = 0;\n      } else if (scrollTop > this.pageHeight - this.viewHeight) {\n        scrollTop = this.pageHeight - this.viewHeight;\n      }\n      return scrollTop;\n    };\n    VScrollBar.prototype.getWidth = function () {\n      return Math.max(this.isVisible ? this.width : 0, this.$minWidth || 0);\n    };\n    VScrollBar.prototype.setHeight = function (height) {\n      this.height = Math.max(0, height);\n      this.slideHeight = this.height;\n      this.viewHeight = this.height;\n      this.setScrollHeight(this.pageHeight, true);\n    };\n    VScrollBar.prototype.setScrollHeight = function (height, force) {\n      if (this.pageHeight === height && !force) return;\n      this.pageHeight = height;\n      this.thumbHeight = (this.slideHeight * this.viewHeight) / this.pageHeight;\n      if (this.thumbHeight > this.slideHeight)\n        this.thumbHeight = this.slideHeight;\n      if (this.thumbHeight < 15) this.thumbHeight = 15;\n      this.inner.style.height = this.thumbHeight + \"px\";\n      if (this.scrollTop > this.pageHeight - this.viewHeight) {\n        this.scrollTop = this.pageHeight - this.viewHeight;\n        if (this.scrollTop < 0) this.scrollTop = 0;\n        this._emit(\"scroll\", { data: this.scrollTop });\n      }\n    };\n    VScrollBar.prototype.setScrollTop = function (scrollTop) {\n      this.scrollTop = scrollTop;\n      if (scrollTop < 0) scrollTop = 0;\n      this.thumbTop =\n        (scrollTop * (this.slideHeight - this.thumbHeight)) /\n        (this.pageHeight - this.viewHeight);\n      this.inner.style.top = this.thumbTop + \"px\";\n    };\n    return VScrollBar;\n  })(ScrollBar);\n  VScrollBar.prototype.setInnerHeight = VScrollBar.prototype.setScrollHeight;\n  var HScrollBar = /** @class */ (function (_super) {\n    __extends(HScrollBar, _super);\n    function HScrollBar(parent, renderer) {\n      var _this = _super.call(this, parent, \"-h\") || this;\n      _this.scrollLeft = 0;\n      _this.scrollWidth = 0;\n      _this.height = _this.HScrollHeight;\n      _this.inner.style.height = _this.element.style.height =\n        (_this.height || 12) + \"px\";\n      _this.renderer = renderer;\n      return _this;\n    }\n    HScrollBar.prototype.onMouseDown = function (eType, e) {\n      if (eType !== \"mousedown\") return;\n      if (event.getButton(e) !== 0 || e.detail === 2) {\n        return;\n      }\n      if (e.target === this.inner) {\n        var self = this;\n        var mousePageX = e.clientX;\n        var onMouseMove = function (e) {\n          mousePageX = e.clientX;\n        };\n        var onMouseUp = function () {\n          clearInterval(timerId);\n        };\n        var startX = e.clientX;\n        var startLeft = this.thumbLeft;\n        var onScrollInterval = function () {\n          if (mousePageX === undefined) return;\n          var scrollLeft = self.scrollLeftFromThumbLeft(\n            startLeft + mousePageX - startX,\n          );\n          if (scrollLeft === self.scrollLeft) return;\n          self._emit(\"scroll\", { data: scrollLeft });\n        };\n        event.capture(this.inner, onMouseMove, onMouseUp);\n        var timerId = setInterval(onScrollInterval, 20);\n        return event.preventDefault(e);\n      }\n      var left =\n        e.clientX -\n        this.element.getBoundingClientRect().left -\n        this.thumbWidth / 2;\n      this._emit(\"scroll\", { data: this.scrollLeftFromThumbLeft(left) });\n      return event.preventDefault(e);\n    };\n    HScrollBar.prototype.getHeight = function () {\n      return this.isVisible ? this.height : 0;\n    };\n    HScrollBar.prototype.scrollLeftFromThumbLeft = function (thumbLeft) {\n      var scrollLeft =\n        (thumbLeft * (this.pageWidth - this.viewWidth)) /\n        (this.slideWidth - this.thumbWidth);\n      scrollLeft = scrollLeft >> 0;\n      if (scrollLeft < 0) {\n        scrollLeft = 0;\n      } else if (scrollLeft > this.pageWidth - this.viewWidth) {\n        scrollLeft = this.pageWidth - this.viewWidth;\n      }\n      return scrollLeft;\n    };\n    HScrollBar.prototype.setWidth = function (width) {\n      this.width = Math.max(0, width);\n      this.element.style.width = this.width + \"px\";\n      this.slideWidth = this.width;\n      this.viewWidth = this.width;\n      this.setScrollWidth(this.pageWidth, true);\n    };\n    HScrollBar.prototype.setScrollWidth = function (width, force) {\n      if (this.pageWidth === width && !force) return;\n      this.pageWidth = width;\n      this.thumbWidth = (this.slideWidth * this.viewWidth) / this.pageWidth;\n      if (this.thumbWidth > this.slideWidth) this.thumbWidth = this.slideWidth;\n      if (this.thumbWidth < 15) this.thumbWidth = 15;\n      this.inner.style.width = this.thumbWidth + \"px\";\n      if (this.scrollLeft > this.pageWidth - this.viewWidth) {\n        this.scrollLeft = this.pageWidth - this.viewWidth;\n        if (this.scrollLeft < 0) this.scrollLeft = 0;\n        this._emit(\"scroll\", { data: this.scrollLeft });\n      }\n    };\n    HScrollBar.prototype.setScrollLeft = function (scrollLeft) {\n      this.scrollLeft = scrollLeft;\n      if (scrollLeft < 0) scrollLeft = 0;\n      this.thumbLeft =\n        (scrollLeft * (this.slideWidth - this.thumbWidth)) /\n        (this.pageWidth - this.viewWidth);\n      this.inner.style.left = this.thumbLeft + \"px\";\n    };\n    return HScrollBar;\n  })(ScrollBar);\n  HScrollBar.prototype.setInnerWidth = HScrollBar.prototype.setScrollWidth;\n  exports.ScrollBar = VScrollBar; // backward compatibility\n  exports.ScrollBarV = VScrollBar; // backward compatibility\n  exports.ScrollBarH = HScrollBar; // backward compatibility\n  exports.VScrollBar = VScrollBar;\n  exports.HScrollBar = HScrollBar;\n});\n\ndefine(\"ace/renderloop\", [\n  \"require\",\n  \"exports\",\n  \"module\",\n  \"ace/lib/event\",\n], function (require, exports, module) {\n  \"use strict\";\n  var event = require(\"./lib/event\");\n  var RenderLoop = /** @class */ (function () {\n    function RenderLoop(onRender, win) {\n      this.onRender = onRender;\n      this.pending = false;\n      this.changes = 0;\n      this.$recursionLimit = 2;\n      this.window = win || window;\n      var _self = this;\n      this._flush = function (ts) {\n        _self.pending = false;\n        var changes = _self.changes;\n        if (changes) {\n          event.blockIdle(100);\n          _self.changes = 0;\n          _self.onRender(changes);\n        }\n        if (_self.changes) {\n          if (_self.$recursionLimit-- < 0) return;\n          _self.schedule();\n        } else {\n          _self.$recursionLimit = 2;\n        }\n      };\n    }\n    RenderLoop.prototype.schedule = function (change) {\n      this.changes = this.changes | change;\n      if (this.changes && !this.pending) {\n        event.nextFrame(this._flush);\n        this.pending = true;\n      }\n    };\n    RenderLoop.prototype.clear = function (change) {\n      var changes = this.changes;\n      this.changes = 0;\n      return changes;\n    };\n    return RenderLoop;\n  })();\n  exports.RenderLoop = RenderLoop;\n});\n\ndefine(\"ace/layer/font_metrics\", [\n  \"require\",\n  \"exports\",\n  \"module\",\n  \"ace/lib/oop\",\n  \"ace/lib/dom\",\n  \"ace/lib/lang\",\n  \"ace/lib/event\",\n  \"ace/lib/useragent\",\n  \"ace/lib/event_emitter\",\n], function (require, exports, module) {\n  var oop = require(\"../lib/oop\");\n  var dom = require(\"../lib/dom\");\n  var lang = require(\"../lib/lang\");\n  var event = require(\"../lib/event\");\n  var useragent = require(\"../lib/useragent\");\n  var EventEmitter = require(\"../lib/event_emitter\").EventEmitter;\n  var CHAR_COUNT = 512;\n  var USE_OBSERVER = typeof ResizeObserver == \"function\";\n  var L = 200;\n  var FontMetrics = /** @class */ (function () {\n    function FontMetrics(parentEl) {\n      this.el = dom.createElement(\"div\");\n      this.$setMeasureNodeStyles(this.el.style, true);\n      this.$main = dom.createElement(\"div\");\n      this.$setMeasureNodeStyles(this.$main.style);\n      this.$measureNode = dom.createElement(\"div\");\n      this.$setMeasureNodeStyles(this.$measureNode.style);\n      this.el.appendChild(this.$main);\n      this.el.appendChild(this.$measureNode);\n      parentEl.appendChild(this.el);\n      this.$measureNode.textContent = lang.stringRepeat(\"X\", CHAR_COUNT);\n      this.$characterSize = { width: 0, height: 0 };\n      if (USE_OBSERVER) this.$addObserver();\n      else this.checkForSizeChanges();\n    }\n    FontMetrics.prototype.$setMeasureNodeStyles = function (style, isRoot) {\n      style.width = style.height = \"auto\";\n      style.left = style.top = \"0px\";\n      style.visibility = \"hidden\";\n      style.position = \"absolute\";\n      style.whiteSpace = \"pre\";\n      if (useragent.isIE < 8) {\n        style[\"font-family\"] = \"inherit\";\n      } else {\n        style.font = \"inherit\";\n      }\n      style.overflow = isRoot ? \"hidden\" : \"visible\";\n    };\n    FontMetrics.prototype.checkForSizeChanges = function (size) {\n      if (size === undefined) size = this.$measureSizes();\n      if (\n        size &&\n        (this.$characterSize.width !== size.width ||\n          this.$characterSize.height !== size.height)\n      ) {\n        this.$measureNode.style.fontWeight = \"bold\";\n        var boldSize = this.$measureSizes();\n        this.$measureNode.style.fontWeight = \"\";\n        this.$characterSize = size;\n        this.charSizes = Object.create(null);\n        this.allowBoldFonts =\n          boldSize &&\n          boldSize.width === size.width &&\n          boldSize.height === size.height;\n        this._emit(\"changeCharacterSize\", { data: size });\n      }\n    };\n    FontMetrics.prototype.$addObserver = function () {\n      var self = this;\n      this.$observer = new window.ResizeObserver(function (e) {\n        self.checkForSizeChanges();\n      });\n      this.$observer.observe(this.$measureNode);\n    };\n    FontMetrics.prototype.$pollSizeChanges = function () {\n      if (this.$pollSizeChangesTimer || this.$observer)\n        return this.$pollSizeChangesTimer;\n      var self = this;\n      return (this.$pollSizeChangesTimer = event.onIdle(function cb() {\n        self.checkForSizeChanges();\n        event.onIdle(cb, 500);\n      }, 500));\n    };\n    FontMetrics.prototype.setPolling = function (val) {\n      if (val) {\n        this.$pollSizeChanges();\n      } else if (this.$pollSizeChangesTimer) {\n        clearInterval(this.$pollSizeChangesTimer);\n        this.$pollSizeChangesTimer = 0;\n      }\n    };\n    FontMetrics.prototype.$measureSizes = function (node) {\n      var size = {\n        height: (node || this.$measureNode).clientHeight,\n        width: (node || this.$measureNode).clientWidth / CHAR_COUNT,\n      };\n      if (size.width === 0 || size.height === 0) return null;\n      return size;\n    };\n    FontMetrics.prototype.$measureCharWidth = function (ch) {\n      this.$main.textContent = lang.stringRepeat(ch, CHAR_COUNT);\n      var rect = this.$main.getBoundingClientRect();\n      return rect.width / CHAR_COUNT;\n    };\n    FontMetrics.prototype.getCharacterWidth = function (ch) {\n      var w = this.charSizes[ch];\n      if (w === undefined) {\n        w = this.charSizes[ch] =\n          this.$measureCharWidth(ch) / this.$characterSize.width;\n      }\n      return w;\n    };\n    FontMetrics.prototype.destroy = function () {\n      clearInterval(this.$pollSizeChangesTimer);\n      if (this.$observer) this.$observer.disconnect();\n      if (this.el && this.el.parentNode)\n        this.el.parentNode.removeChild(this.el);\n    };\n    FontMetrics.prototype.$getZoom = function (element) {\n      if (!element || !element.parentElement) return 1;\n      return (\n        (window.getComputedStyle(element)[\"zoom\"] || 1) *\n        this.$getZoom(element.parentElement)\n      );\n    };\n    FontMetrics.prototype.$initTransformMeasureNodes = function () {\n      var t = function (t, l) {\n        return [\n          \"div\",\n          {\n            style: \"position: absolute;top:\" + t + \"px;left:\" + l + \"px;\",\n          },\n        ];\n      };\n      this.els = dom.buildDom([t(0, 0), t(L, 0), t(0, L), t(L, L)], this.el);\n    };\n    FontMetrics.prototype.transformCoordinates = function (clientPos, elPos) {\n      if (clientPos) {\n        var zoom = this.$getZoom(this.el);\n        clientPos = mul(1 / zoom, clientPos);\n      }\n      function solve(l1, l2, r) {\n        var det = l1[1] * l2[0] - l1[0] * l2[1];\n        return [\n          (-l2[1] * r[0] + l2[0] * r[1]) / det,\n          (+l1[1] * r[0] - l1[0] * r[1]) / det,\n        ];\n      }\n      function sub(a, b) {\n        return [a[0] - b[0], a[1] - b[1]];\n      }\n      function add(a, b) {\n        return [a[0] + b[0], a[1] + b[1]];\n      }\n      function mul(a, b) {\n        return [a * b[0], a * b[1]];\n      }\n      if (!this.els) this.$initTransformMeasureNodes();\n      function p(el) {\n        var r = el.getBoundingClientRect();\n        return [r.left, r.top];\n      }\n      var a = p(this.els[0]);\n      var b = p(this.els[1]);\n      var c = p(this.els[2]);\n      var d = p(this.els[3]);\n      var h = solve(sub(d, b), sub(d, c), sub(add(b, c), add(d, a)));\n      var m1 = mul(1 + h[0], sub(b, a));\n      var m2 = mul(1 + h[1], sub(c, a));\n      if (elPos) {\n        var x = elPos;\n        var k = (h[0] * x[0]) / L + (h[1] * x[1]) / L + 1;\n        var ut = add(mul(x[0], m1), mul(x[1], m2));\n        return add(mul(1 / k / L, ut), a);\n      }\n      var u = sub(clientPos, a);\n      var f = solve(sub(m1, mul(h[0], u)), sub(m2, mul(h[1], u)), u);\n      return mul(L, f);\n    };\n    return FontMetrics;\n  })();\n  FontMetrics.prototype.$characterSize = { width: 0, height: 0 };\n  oop.implement(FontMetrics.prototype, EventEmitter);\n  exports.FontMetrics = FontMetrics;\n});\n\ndefine(\"ace/css/editor-css\", [\"require\", \"exports\", \"module\"], function (\n  require,\n  exports,\n  module,\n) {\n  /*\n    styles = []\n    for (var i = 1; i < 16; i++) {\n        styles.push(\".ace_br\" + i + \"{\" + (\n            [\"top-left\", \"top-right\", \"bottom-right\", \"bottom-left\"]\n        ).map(function(x, j) {\n            return i & (1<<j) ? \"border-\" + x + \"-radius: 3px;\" : \"\"\n        }).filter(Boolean).join(\" \") + \"}\")\n    }\n    styles.join(\"\\\\n\")\n    */\n  module.exports =\n    '\\n.ace_br1 {border-top-left-radius    : 3px;}\\n.ace_br2 {border-top-right-radius   : 3px;}\\n.ace_br3 {border-top-left-radius    : 3px; border-top-right-radius:    3px;}\\n.ace_br4 {border-bottom-right-radius: 3px;}\\n.ace_br5 {border-top-left-radius    : 3px; border-bottom-right-radius: 3px;}\\n.ace_br6 {border-top-right-radius   : 3px; border-bottom-right-radius: 3px;}\\n.ace_br7 {border-top-left-radius    : 3px; border-top-right-radius:    3px; border-bottom-right-radius: 3px;}\\n.ace_br8 {border-bottom-left-radius : 3px;}\\n.ace_br9 {border-top-left-radius    : 3px; border-bottom-left-radius:  3px;}\\n.ace_br10{border-top-right-radius   : 3px; border-bottom-left-radius:  3px;}\\n.ace_br11{border-top-left-radius    : 3px; border-top-right-radius:    3px; border-bottom-left-radius:  3px;}\\n.ace_br12{border-bottom-right-radius: 3px; border-bottom-left-radius:  3px;}\\n.ace_br13{border-top-left-radius    : 3px; border-bottom-right-radius: 3px; border-bottom-left-radius:  3px;}\\n.ace_br14{border-top-right-radius   : 3px; border-bottom-right-radius: 3px; border-bottom-left-radius:  3px;}\\n.ace_br15{border-top-left-radius    : 3px; border-top-right-radius:    3px; border-bottom-right-radius: 3px; border-bottom-left-radius: 3px;}\\n\\n\\n.ace_editor {\\n    position: relative;\\n    overflow: hidden;\\n    padding: 0;\\n    font: 12px/normal \\'Monaco\\', \\'Menlo\\', \\'Ubuntu Mono\\', \\'Consolas\\', \\'Source Code Pro\\', \\'source-code-pro\\', monospace;\\n    direction: ltr;\\n    text-align: left;\\n    -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\\n}\\n\\n.ace_scroller {\\n    position: absolute;\\n    overflow: hidden;\\n    top: 0;\\n    bottom: 0;\\n    background-color: inherit;\\n    -ms-user-select: none;\\n    -moz-user-select: none;\\n    -webkit-user-select: none;\\n    user-select: none;\\n    cursor: text;\\n}\\n\\n.ace_content {\\n    position: absolute;\\n    box-sizing: border-box;\\n    min-width: 100%;\\n    contain: style size layout;\\n    font-variant-ligatures: no-common-ligatures;\\n}\\n\\n.ace_keyboard-focus:focus {\\n    box-shadow: inset 0 0 0 2px #5E9ED6;\\n    outline: none;\\n}\\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\\n.ace_gutter {\\n    position: absolute;\\n    overflow : hidden;\\n    width: auto;\\n    top: 0;\\n    bottom: 0;\\n    left: 0;\\n    cursor: default;\\n    z-index: 4;\\n    -ms-user-select: none;\\n    -moz-user-select: none;\\n    -webkit-user-select: none;\\n    user-select: none;\\n    contain: style size layout;\\n}\\n\\n.ace_gutter-active-line {\\n    position: absolute;\\n    left: 0;\\n    right: 0;\\n}\\n\\n.ace_scroller.ace_scroll-left:after {\\n    content: \"\";\\n    position: absolute;\\n    top: 0;\\n    right: 0;\\n    bottom: 0;\\n    left: 0;\\n    box-shadow: 17px 0 16px -16px rgba(0, 0, 0, 0.4) inset;\\n    pointer-events: none;\\n}\\n\\n.ace_gutter-cell, .ace_gutter-cell_svg-icons {\\n    position: absolute;\\n    top: 0;\\n    left: 0;\\n    right: 0;\\n    padding-left: 19px;\\n    padding-right: 6px;\\n    background-repeat: no-repeat;\\n}\\n\\n.ace_gutter-cell_svg-icons .ace_gutter_annotation {\\n    margin-left: -14px;\\n    float: left;\\n}\\n\\n.ace_gutter-cell .ace_gutter_annotation {\\n    margin-left: -19px;\\n    float: left;\\n}\\n\\n.ace_gutter-cell.ace_error, .ace_icon.ace_error, .ace_icon.ace_error_fold {\\n    background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABOFBMVEX/////////QRswFAb/Ui4wFAYwFAYwFAaWGAfDRymzOSH/PxswFAb/SiUwFAYwFAbUPRvjQiDllog5HhHdRybsTi3/Tyv9Tir+Syj/UC3////XurebMBIwFAb/RSHbPx/gUzfdwL3kzMivKBAwFAbbvbnhPx66NhowFAYwFAaZJg8wFAaxKBDZurf/RB6mMxb/SCMwFAYwFAbxQB3+RB4wFAb/Qhy4Oh+4QifbNRcwFAYwFAYwFAb/QRzdNhgwFAYwFAbav7v/Uy7oaE68MBK5LxLewr/r2NXewLswFAaxJw4wFAbkPRy2PyYwFAaxKhLm1tMwFAazPiQwFAaUGAb/QBrfOx3bvrv/VC/maE4wFAbRPBq6MRO8Qynew8Dp2tjfwb0wFAbx6eju5+by6uns4uH9/f36+vr/GkHjAAAAYnRSTlMAGt+64rnWu/bo8eAA4InH3+DwoN7j4eLi4xP99Nfg4+b+/u9B/eDs1MD1mO7+4PHg2MXa347g7vDizMLN4eG+Pv7i5evs/v79yu7S3/DV7/498Yv24eH+4ufQ3Ozu/v7+y13sRqwAAADLSURBVHjaZc/XDsFgGIBhtDrshlitmk2IrbHFqL2pvXf/+78DPokj7+Fz9qpU/9UXJIlhmPaTaQ6QPaz0mm+5gwkgovcV6GZzd5JtCQwgsxoHOvJO15kleRLAnMgHFIESUEPmawB9ngmelTtipwwfASilxOLyiV5UVUyVAfbG0cCPHig+GBkzAENHS0AstVF6bacZIOzgLmxsHbt2OecNgJC83JERmePUYq8ARGkJx6XtFsdddBQgZE2nPR6CICZhawjA4Fb/chv+399kfR+MMMDGOQAAAABJRU5ErkJggg==\");\\n    background-repeat: no-repeat;\\n    background-position: 2px center;\\n}\\n\\n.ace_gutter-cell.ace_warning, .ace_icon.ace_warning, .ace_icon.ace_warning_fold {\\n    background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAmVBMVEX///8AAAD///8AAAAAAABPSzb/5sAAAAB/blH/73z/ulkAAAAAAAD85pkAAAAAAAACAgP/vGz/rkDerGbGrV7/pkQICAf////e0IsAAAD/oED/qTvhrnUAAAD/yHD/njcAAADuv2r/nz//oTj/p064oGf/zHAAAAA9Nir/tFIAAAD/tlTiuWf/tkIAAACynXEAAAAAAAAtIRW7zBpBAAAAM3RSTlMAABR1m7RXO8Ln31Z36zT+neXe5OzooRDfn+TZ4p3h2hTf4t3k3ucyrN1K5+Xaks52Sfs9CXgrAAAAjklEQVR42o3PbQ+CIBQFYEwboPhSYgoYunIqqLn6/z8uYdH8Vmdnu9vz4WwXgN/xTPRD2+sgOcZjsge/whXZgUaYYvT8QnuJaUrjrHUQreGczuEafQCO/SJTufTbroWsPgsllVhq3wJEk2jUSzX3CUEDJC84707djRc5MTAQxoLgupWRwW6UB5fS++NV8AbOZgnsC7BpEAAAAABJRU5ErkJggg==\");\\n    background-repeat: no-repeat;\\n    background-position: 2px center;\\n}\\n\\n.ace_gutter-cell.ace_info, .ace_icon.ace_info {\\n    background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAAAAAA6mKC9AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAAJ0Uk5TAAB2k804AAAAPklEQVQY02NgIB68QuO3tiLznjAwpKTgNyDbMegwisCHZUETUZV0ZqOquBpXj2rtnpSJT1AEnnRmL2OgGgAAIKkRQap2htgAAAAASUVORK5CYII=\");\\n    background-repeat: no-repeat;\\n    background-position: 2px center;\\n}\\n.ace_dark .ace_gutter-cell.ace_info, .ace_dark .ace_icon.ace_info {\\n    background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAJFBMVEUAAAChoaGAgIAqKiq+vr6tra1ZWVmUlJSbm5s8PDxubm56enrdgzg3AAAAAXRSTlMAQObYZgAAAClJREFUeNpjYMAPdsMYHegyJZFQBlsUlMFVCWUYKkAZMxZAGdxlDMQBAG+TBP4B6RyJAAAAAElFTkSuQmCC\");\\n}\\n\\n.ace_icon_svg.ace_error {\\n    -webkit-mask-image: url(\"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMCAxNiI+CjxnIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlPSJyZWQiIHNoYXBlLXJlbmRlcmluZz0iZ2VvbWV0cmljUHJlY2lzaW9uIj4KPGNpcmNsZSBmaWxsPSJub25lIiBjeD0iOCIgY3k9IjgiIHI9IjciIHN0cm9rZS1saW5lam9pbj0icm91bmQiLz4KPGxpbmUgeDE9IjExIiB5MT0iNSIgeDI9IjUiIHkyPSIxMSIvPgo8bGluZSB4MT0iMTEiIHkxPSIxMSIgeDI9IjUiIHkyPSI1Ii8+CjwvZz4KPC9zdmc+\");\\n    background-color: crimson;\\n}\\n.ace_icon_svg.ace_warning {\\n    -webkit-mask-image: url(\"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMCAxNiI+CjxnIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlPSJkYXJrb3JhbmdlIiBzaGFwZS1yZW5kZXJpbmc9Imdlb21ldHJpY1ByZWNpc2lvbiI+Cjxwb2x5Z29uIHN0cm9rZS1saW5lam9pbj0icm91bmQiIGZpbGw9Im5vbmUiIHBvaW50cz0iOCAxIDE1IDE1IDEgMTUgOCAxIi8+CjxyZWN0IHg9IjgiIHk9IjEyIiB3aWR0aD0iMC4wMSIgaGVpZ2h0PSIwLjAxIi8+CjxsaW5lIHgxPSI4IiB5MT0iNiIgeDI9IjgiIHkyPSIxMCIvPgo8L2c+Cjwvc3ZnPg==\");\\n    background-color: darkorange;\\n}\\n.ace_icon_svg.ace_info {\\n    -webkit-mask-image: url(\"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMCAxNiI+CjxnIHN0cm9rZS13aWR0aD0iMiIgc3Ryb2tlPSJibHVlIiBzaGFwZS1yZW5kZXJpbmc9Imdlb21ldHJpY1ByZWNpc2lvbiI+CjxjaXJjbGUgZmlsbD0ibm9uZSIgY3g9IjgiIGN5PSI4IiByPSI3IiBzdHJva2UtbGluZWpvaW49InJvdW5kIi8+Cjxwb2x5bGluZSBwb2ludHM9IjggMTEgOCA4Ii8+Cjxwb2x5bGluZSBwb2ludHM9IjkgOCA2IDgiLz4KPGxpbmUgeDE9IjEwIiB5MT0iMTEiIHgyPSI2IiB5Mj0iMTEiLz4KPHJlY3QgeD0iOCIgeT0iNSIgd2lkdGg9IjAuMDEiIGhlaWdodD0iMC4wMSIvPgo8L2c+Cjwvc3ZnPg==\");\\n    background-color: royalblue;\\n}\\n\\n.ace_icon_svg.ace_error_fold {\\n    -webkit-mask-image: url(\"data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyMCAxNiIgZmlsbD0ibm9uZSI+CiAgPHBhdGggZD0ibSAxOC45Mjk4NTEsNy44Mjk4MDc2IGMgMC4xNDYzNTMsNi4zMzc0NjA0IC02LjMyMzE0Nyw3Ljc3Nzg0NDQgLTcuNDc3OTEyLDcuNzc3ODQ0NCAtMi4xMDcyNzI2LC0wLjEyODc1IDUuMTE3Njc4LDAuMzU2MjQ5IDUuMDUxNjk4LC03Ljg3MDA2MTggLTAuNjA0NjcyLC04LjAwMzk3MzQ5IC03LjA3NzI3MDYsLTcuNTYzMTE4OSAtNC44NTczLC03LjQzMDM5NTU2IDEuNjA2LC0wLjExNTE0MjI1IDYuODk3NDg1LDEuMjYyNTQ1OTYgNy4yODM1MTQsNy41MjI2MTI5NiB6IiBmaWxsPSJjcmltc29uIiBzdHJva2Utd2lkdGg9IjIiLz4KICA8cGF0aCBmaWxsLXJ1bGU9ImV2ZW5vZGQiIGNsaXAtcnVsZT0iZXZlbm9kZCIgZD0ibSA4LjExNDc1NjIsMi4wNTI5ODI4IGMgMy4zNDkxNjk4LDAgNi4wNjQxMzI4LDIuNjc2ODYyNyA2LjA2NDEzMjgsNS45Nzg5NTMgMCwzLjMwMjExMjIgLTIuNzE0OTYzLDUuOTc4OTIwMiAtNi4wNjQxMzI4LDUuOTc4OTIwMiAtMy4zNDkxNDczLDAgLTYuMDY0MTc3MiwtMi42NzY4MDggLTYuMDY0MTc3MiwtNS45Nzg5MjAyIDAuMDA1MzksLTMuMjk5ODg2MSAyLjcxNzI2NTYsLTUuOTczNjQwOCA2LjA2NDE3NzIsLTUuOTc4OTUzIHogbSAwLC0xLjczNTgyNzE5IGMgLTQuMzIxNDgzNiwwIC03LjgyNDc0MDM4LDMuNDU0MDE4NDkgLTcuODI0NzQwMzgsNy43MTQ3ODAxOSAwLDQuMjYwNzI4MiAzLjUwMzI1Njc4LDcuNzE0NzQ1MiA3LjgyNDc0MDM4LDcuNzE0NzQ1MiA0LjMyMTQ0OTgsMCA3LjgyNDY5OTgsLTMuNDU0MDE3IDcuODI0Njk5OCwtNy43MTQ3NDUyIDAsLTIuMDQ2MDkxNCAtMC44MjQzOTIsLTQuMDA4MzY3MiAtMi4yOTE3NTYsLTUuNDU1MTc0NiBDIDEyLjE4MDIyNSwxLjEyOTk2NDggMTAuMTkwMDEzLDAuMzE3MTU1NjEgOC4xMTQ3NTYyLDAuMzE3MTU1NjEgWiBNIDYuOTM3NDU2Myw4LjI0MDU5ODUgNC42NzE4Njg1LDEwLjQ4NTg1MiA2LjAwODY4MTQsMTEuODc2NzI4IDguMzE3MDAzNSw5LjYwMDc5MTEgMTAuNjI1MzM3LDExLjg3NjcyOCAxMS45NjIxMzgsMTAuNDg1ODUyIDkuNjk2NTUwOCw4LjI0MDU5ODUgMTEuOTYyMTM4LDYuMDA2ODA2NiAxMC41NzMyNDYsNC42Mzc0MzM1IDguMzE3MDAzNSw2Ljg3MzQyOTcgNi4wNjA3NjA3LDQuNjM3NDMzNSA0LjY3MTg2ODUsNi4wMDY4MDY2IFoiIGZpbGw9ImNyaW1zb24iIHN0cm9rZS13aWR0aD0iMiIvPgo8L3N2Zz4=\");\\n    background-color: crimson;\\n}\\n.ace_icon_svg.ace_warning_fold {\\n    -webkit-mask-image: url(\"data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjAiIGhlaWdodD0iMTYiIHZpZXdCb3g9IjAgMCAyMCAxNiIgZmlsbD0ibm9uZSIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KPHBhdGggZmlsbC1ydWxlPSJldmVub2RkIiBjbGlwLXJ1bGU9ImV2ZW5vZGQiIGQ9Ik0xNC43NzY5IDE0LjczMzdMOC42NTE5MiAyLjQ4MzY5QzguMzI5NDYgMS44Mzg3NyA3LjQwOTEzIDEuODM4NzcgNy4wODY2NyAyLjQ4MzY5TDAuOTYxNjY5IDE0LjczMzdDMC42NzA3NzUgMTUuMzE1NSAxLjA5MzgzIDE2IDEuNzQ0MjkgMTZIMTMuOTk0M0MxNC42NDQ4IDE2IDE1LjA2NzggMTUuMzE1NSAxNC43NzY5IDE0LjczMzdaTTMuMTYwMDcgMTQuMjVMNy44NjkyOSA0LjgzMTU2TDEyLjU3ODUgMTQuMjVIMy4xNjAwN1pNOC43NDQyOSAxMS42MjVWMTMuMzc1SDYuOTk0MjlWMTEuNjI1SDguNzQ0MjlaTTYuOTk0MjkgMTAuNzVWNy4yNUg4Ljc0NDI5VjEwLjc1SDYuOTk0MjlaIiBmaWxsPSIjRUM3MjExIi8+CjxwYXRoIGQ9Ik0xMS4xOTkxIDIuOTUyMzhDMTAuODgwOSAyLjMxNDY3IDEwLjM1MzcgMS44MDUyNiA5LjcwNTUgMS41MDlMMTEuMDQxIDEuMDY5NzhDMTEuNjg4MyAwLjk0OTgxNCAxMi4zMzcgMS4yNzI2MyAxMi42MzE3IDEuODYxNDFMMTcuNjEzNiAxMS44MTYxQzE4LjM1MjcgMTMuMjkyOSAxNy41OTM4IDE1LjA4MDQgMTYuMDE4IDE1LjU3NDVDMTYuNDA0NCAxNC40NTA3IDE2LjMyMzEgMTMuMjE4OCAxNS43OTI0IDEyLjE1NTVMMTEuMTk5MSAyLjk1MjM4WiIgZmlsbD0iI0VDNzIxMSIvPgo8L3N2Zz4=\");\\n    background-color: darkorange;\\n}\\n\\n.ace_scrollbar {\\n    contain: strict;\\n    position: absolute;\\n    right: 0;\\n    bottom: 0;\\n    z-index: 6;\\n}\\n\\n.ace_scrollbar-inner {\\n    position: absolute;\\n    cursor: text;\\n    left: 0;\\n    top: 0;\\n}\\n\\n.ace_scrollbar-v{\\n    overflow-x: hidden;\\n    overflow-y: scroll;\\n    top: 0;\\n}\\n\\n.ace_scrollbar-h {\\n    overflow-x: scroll;\\n    overflow-y: hidden;\\n    left: 0;\\n}\\n\\n.ace_print-margin {\\n    position: absolute;\\n    height: 100%;\\n}\\n\\n.ace_text-input {\\n    position: absolute;\\n    z-index: 0;\\n    width: 0.5em;\\n    height: 1em;\\n    opacity: 0;\\n    background: transparent;\\n    -moz-appearance: none;\\n    appearance: none;\\n    border: none;\\n    resize: none;\\n    outline: none;\\n    overflow: hidden;\\n    font: inherit;\\n    padding: 0 1px;\\n    margin: 0 -1px;\\n    contain: strict;\\n    -ms-user-select: text;\\n    -moz-user-select: text;\\n    -webkit-user-select: text;\\n    user-select: text;\\n    /*with `pre-line` chrome inserts &nbsp; instead of space*/\\n    white-space: pre!important;\\n}\\n.ace_text-input.ace_composition {\\n    background: transparent;\\n    color: inherit;\\n    z-index: 1000;\\n    opacity: 1;\\n}\\n.ace_composition_placeholder { color: transparent }\\n.ace_composition_marker { \\n    border-bottom: 1px solid;\\n    position: absolute;\\n    border-radius: 0;\\n    margin-top: 1px;\\n}\\n\\n[ace_nocontext=true] {\\n    transform: none!important;\\n    filter: none!important;\\n    clip-path: none!important;\\n    mask : none!important;\\n    contain: none!important;\\n    perspective: none!important;\\n    mix-blend-mode: initial!important;\\n    z-index: auto;\\n}\\n\\n.ace_layer {\\n    z-index: 1;\\n    position: absolute;\\n    overflow: hidden;\\n    /* workaround for chrome bug https://github.com/ajaxorg/ace/issues/2312*/\\n    word-wrap: normal;\\n    white-space: pre;\\n    height: 100%;\\n    width: 100%;\\n    box-sizing: border-box;\\n    /* setting pointer-events: auto; on node under the mouse, which changes\\n        during scroll, will break mouse wheel scrolling in Safari */\\n    pointer-events: none;\\n}\\n\\n.ace_gutter-layer {\\n    position: relative;\\n    width: auto;\\n    text-align: right;\\n    pointer-events: auto;\\n    height: 1000000px;\\n    contain: style size layout;\\n}\\n\\n.ace_text-layer {\\n    font: inherit !important;\\n    position: absolute;\\n    height: 1000000px;\\n    width: 1000000px;\\n    contain: style size layout;\\n}\\n\\n.ace_text-layer > .ace_line, .ace_text-layer > .ace_line_group {\\n    contain: style size layout;\\n    position: absolute;\\n    top: 0;\\n    left: 0;\\n    right: 0;\\n}\\n\\n.ace_hidpi .ace_text-layer,\\n.ace_hidpi .ace_gutter-layer,\\n.ace_hidpi .ace_content,\\n.ace_hidpi .ace_gutter {\\n    contain: strict;\\n}\\n.ace_hidpi .ace_text-layer > .ace_line, \\n.ace_hidpi .ace_text-layer > .ace_line_group {\\n    contain: strict;\\n}\\n\\n.ace_cjk {\\n    display: inline-block;\\n    text-align: center;\\n}\\n\\n.ace_cursor-layer {\\n    z-index: 4;\\n}\\n\\n.ace_cursor {\\n    z-index: 4;\\n    position: absolute;\\n    box-sizing: border-box;\\n    border-left: 2px solid;\\n    /* workaround for smooth cursor repaintng whole screen in chrome */\\n    transform: translatez(0);\\n}\\n\\n.ace_multiselect .ace_cursor {\\n    border-left-width: 1px;\\n}\\n\\n.ace_slim-cursors .ace_cursor {\\n    border-left-width: 1px;\\n}\\n\\n.ace_overwrite-cursors .ace_cursor {\\n    border-left-width: 0;\\n    border-bottom: 1px solid;\\n}\\n\\n.ace_hidden-cursors .ace_cursor {\\n    opacity: 0.2;\\n}\\n\\n.ace_hasPlaceholder .ace_hidden-cursors .ace_cursor {\\n    opacity: 0;\\n}\\n\\n.ace_smooth-blinking .ace_cursor {\\n    transition: opacity 0.18s;\\n}\\n\\n.ace_animate-blinking .ace_cursor {\\n    animation-duration: 1000ms;\\n    animation-timing-function: step-end;\\n    animation-name: blink-ace-animate;\\n    animation-iteration-count: infinite;\\n}\\n\\n.ace_animate-blinking.ace_smooth-blinking .ace_cursor {\\n    animation-duration: 1000ms;\\n    animation-timing-function: ease-in-out;\\n    animation-name: blink-ace-animate-smooth;\\n}\\n    \\n@keyframes blink-ace-animate {\\n    from, to { opacity: 1; }\\n    60% { opacity: 0; }\\n}\\n\\n@keyframes blink-ace-animate-smooth {\\n    from, to { opacity: 1; }\\n    45% { opacity: 1; }\\n    60% { opacity: 0; }\\n    85% { opacity: 0; }\\n}\\n\\n.ace_marker-layer .ace_step, .ace_marker-layer .ace_stack {\\n    position: absolute;\\n    z-index: 3;\\n}\\n\\n.ace_marker-layer .ace_selection {\\n    position: absolute;\\n    z-index: 5;\\n}\\n\\n.ace_marker-layer .ace_bracket {\\n    position: absolute;\\n    z-index: 6;\\n}\\n\\n.ace_marker-layer .ace_error_bracket {\\n    position: absolute;\\n    border-bottom: 1px solid #DE5555;\\n    border-radius: 0;\\n}\\n\\n.ace_marker-layer .ace_active-line {\\n    position: absolute;\\n    z-index: 2;\\n}\\n\\n.ace_marker-layer .ace_selected-word {\\n    position: absolute;\\n    z-index: 4;\\n    box-sizing: border-box;\\n}\\n\\n.ace_line .ace_fold {\\n    box-sizing: border-box;\\n\\n    display: inline-block;\\n    height: 11px;\\n    margin-top: -2px;\\n    vertical-align: middle;\\n\\n    background-image:\\n        url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII=\"),\\n        url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACJJREFUeNpi+P//fxgTAwPDBxDxD078RSX+YeEyDFMCIMAAI3INmXiwf2YAAAAASUVORK5CYII=\");\\n    background-repeat: no-repeat, repeat-x;\\n    background-position: center center, top left;\\n    color: transparent;\\n\\n    border: 1px solid black;\\n    border-radius: 2px;\\n\\n    cursor: pointer;\\n    pointer-events: auto;\\n}\\n\\n.ace_dark .ace_fold {\\n}\\n\\n.ace_fold:hover{\\n    background-image:\\n        url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABEAAAAJCAYAAADU6McMAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAJpJREFUeNpi/P//PwOlgAXGYGRklAVSokD8GmjwY1wasKljQpYACtpCFeADcHVQfQyMQAwzwAZI3wJKvCLkfKBaMSClBlR7BOQikCFGQEErIH0VqkabiGCAqwUadAzZJRxQr/0gwiXIal8zQQPnNVTgJ1TdawL0T5gBIP1MUJNhBv2HKoQHHjqNrA4WO4zY0glyNKLT2KIfIMAAQsdgGiXvgnYAAAAASUVORK5CYII=\"),\\n        url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAA3CAYAAADNNiA5AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAACBJREFUeNpi+P//fz4TAwPDZxDxD5X4i5fLMEwJgAADAEPVDbjNw87ZAAAAAElFTkSuQmCC\");\\n}\\n\\n.ace_tooltip {\\n    background-color: #f5f5f5;\\n    border: 1px solid gray;\\n    border-radius: 1px;\\n    box-shadow: 0 1px 2px rgba(0, 0, 0, 0.3);\\n    color: black;\\n    max-width: 100%;\\n    padding: 3px 4px;\\n    position: fixed;\\n    z-index: 999999;\\n    box-sizing: border-box;\\n    cursor: default;\\n    white-space: pre-wrap;\\n    word-wrap: break-word;\\n    line-height: normal;\\n    font-style: normal;\\n    font-weight: normal;\\n    letter-spacing: normal;\\n    pointer-events: none;\\n    overflow: auto;\\n    max-width: min(60em, 66vw);\\n    overscroll-behavior: contain;\\n}\\n.ace_tooltip pre {\\n    white-space: pre-wrap;\\n}\\n\\n.ace_tooltip.ace_dark {\\n    background-color: #636363;\\n    color: #fff;\\n}\\n\\n.ace_tooltip:focus {\\n    outline: 1px solid #5E9ED6;\\n}\\n\\n.ace_icon {\\n    display: inline-block;\\n    width: 18px;\\n    vertical-align: top;\\n}\\n\\n.ace_icon_svg {\\n    display: inline-block;\\n    width: 12px;\\n    vertical-align: top;\\n    -webkit-mask-repeat: no-repeat;\\n    -webkit-mask-size: 12px;\\n    -webkit-mask-position: center;\\n}\\n\\n.ace_folding-enabled > .ace_gutter-cell, .ace_folding-enabled > .ace_gutter-cell_svg-icons {\\n    padding-right: 13px;\\n}\\n\\n.ace_fold-widget {\\n    box-sizing: border-box;\\n\\n    margin: 0 -12px 0 1px;\\n    display: none;\\n    width: 11px;\\n    vertical-align: top;\\n\\n    background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42mWKsQ0AMAzC8ixLlrzQjzmBiEjp0A6WwBCSPgKAXoLkqSot7nN3yMwR7pZ32NzpKkVoDBUxKAAAAABJRU5ErkJggg==\");\\n    background-repeat: no-repeat;\\n    background-position: center;\\n\\n    border-radius: 3px;\\n    \\n    border: 1px solid transparent;\\n    cursor: pointer;\\n}\\n\\n.ace_folding-enabled .ace_fold-widget {\\n    display: inline-block;   \\n}\\n\\n.ace_fold-widget.ace_end {\\n    background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAANElEQVR42m3HwQkAMAhD0YzsRchFKI7sAikeWkrxwScEB0nh5e7KTPWimZki4tYfVbX+MNl4pyZXejUO1QAAAABJRU5ErkJggg==\");\\n}\\n\\n.ace_fold-widget.ace_closed {\\n    background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAGCAYAAAAG5SQMAAAAOUlEQVR42jXKwQkAMAgDwKwqKD4EwQ26sSOkVWjgIIHAzPiCgaqiqnJHZnKICBERHN194O5b9vbLuAVRL+l0YWnZAAAAAElFTkSuQmCCXA==\");\\n}\\n\\n.ace_fold-widget:hover {\\n    border: 1px solid rgba(0, 0, 0, 0.3);\\n    background-color: rgba(255, 255, 255, 0.2);\\n    box-shadow: 0 1px 1px rgba(255, 255, 255, 0.7);\\n}\\n\\n.ace_fold-widget:active {\\n    border: 1px solid rgba(0, 0, 0, 0.4);\\n    background-color: rgba(0, 0, 0, 0.05);\\n    box-shadow: 0 1px 1px rgba(255, 255, 255, 0.8);\\n}\\n/**\\n * Dark version for fold widgets\\n */\\n.ace_dark .ace_fold-widget {\\n    background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHklEQVQIW2P4//8/AzoGEQ7oGCaLLAhWiSwB146BAQCSTPYocqT0AAAAAElFTkSuQmCC\");\\n}\\n.ace_dark .ace_fold-widget.ace_end {\\n    background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAH0lEQVQIW2P4//8/AxQ7wNjIAjDMgC4AxjCVKBirIAAF0kz2rlhxpAAAAABJRU5ErkJggg==\");\\n}\\n.ace_dark .ace_fold-widget.ace_closed {\\n    background-image: url(\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAMAAAAFCAYAAACAcVaiAAAAHElEQVQIW2P4//+/AxAzgDADlOOAznHAKgPWAwARji8UIDTfQQAAAABJRU5ErkJggg==\");\\n}\\n.ace_dark .ace_fold-widget:hover {\\n    box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);\\n    background-color: rgba(255, 255, 255, 0.1);\\n}\\n.ace_dark .ace_fold-widget:active {\\n    box-shadow: 0 1px 1px rgba(255, 255, 255, 0.2);\\n}\\n\\n.ace_inline_button {\\n    border: 1px solid lightgray;\\n    display: inline-block;\\n    margin: -1px 8px;\\n    padding: 0 5px;\\n    pointer-events: auto;\\n    cursor: pointer;\\n}\\n.ace_inline_button:hover {\\n    border-color: gray;\\n    background: rgba(200,200,200,0.2);\\n    display: inline-block;\\n    pointer-events: auto;\\n}\\n\\n.ace_fold-widget.ace_invalid {\\n    background-color: #FFB4B4;\\n    border-color: #DE5555;\\n}\\n\\n.ace_fade-fold-widgets .ace_fold-widget {\\n    transition: opacity 0.4s ease 0.05s;\\n    opacity: 0;\\n}\\n\\n.ace_fade-fold-widgets:hover .ace_fold-widget {\\n    transition: opacity 0.05s ease 0.05s;\\n    opacity:1;\\n}\\n\\n.ace_underline {\\n    text-decoration: underline;\\n}\\n\\n.ace_bold {\\n    font-weight: bold;\\n}\\n\\n.ace_nobold .ace_bold {\\n    font-weight: normal;\\n}\\n\\n.ace_italic {\\n    font-style: italic;\\n}\\n\\n\\n.ace_error-marker {\\n    background-color: rgba(255, 0, 0,0.2);\\n    position: absolute;\\n    z-index: 9;\\n}\\n\\n.ace_highlight-marker {\\n    background-color: rgba(255, 255, 0,0.2);\\n    position: absolute;\\n    z-index: 8;\\n}\\n\\n.ace_mobile-menu {\\n    position: absolute;\\n    line-height: 1.5;\\n    border-radius: 4px;\\n    -ms-user-select: none;\\n    -moz-user-select: none;\\n    -webkit-user-select: none;\\n    user-select: none;\\n    background: white;\\n    box-shadow: 1px 3px 2px grey;\\n    border: 1px solid #dcdcdc;\\n    color: black;\\n}\\n.ace_dark > .ace_mobile-menu {\\n    background: #333;\\n    color: #ccc;\\n    box-shadow: 1px 3px 2px grey;\\n    border: 1px solid #444;\\n\\n}\\n.ace_mobile-button {\\n    padding: 2px;\\n    cursor: pointer;\\n    overflow: hidden;\\n}\\n.ace_mobile-button:hover {\\n    background-color: #eee;\\n    opacity:1;\\n}\\n.ace_mobile-button:active {\\n    background-color: #ddd;\\n}\\n\\n.ace_placeholder {\\n    font-family: arial;\\n    transform: scale(0.9);\\n    transform-origin: left;\\n    white-space: pre;\\n    opacity: 0.7;\\n    margin: 0 10px;\\n}\\n\\n.ace_ghost_text {\\n    opacity: 0.5;\\n    font-style: italic;\\n    white-space: pre;\\n}\\n\\n.ace_screenreader-only {\\n    position:absolute;\\n    left:-10000px;\\n    top:auto;\\n    width:1px;\\n    height:1px;\\n    overflow:hidden;\\n}';\n});\n\ndefine(\"ace/layer/decorators\", [\n  \"require\",\n  \"exports\",\n  \"module\",\n  \"ace/lib/dom\",\n  \"ace/lib/oop\",\n  \"ace/lib/event_emitter\",\n], function (require, exports, module) {\n  \"use strict\";\n  var dom = require(\"../lib/dom\");\n  var oop = require(\"../lib/oop\");\n  var EventEmitter = require(\"../lib/event_emitter\").EventEmitter;\n  var Decorator = /** @class */ (function () {\n    function Decorator(parent, renderer) {\n      this.canvas = dom.createElement(\"canvas\");\n      this.renderer = renderer;\n      this.pixelRatio = 1;\n      this.maxHeight = renderer.layerConfig.maxHeight;\n      this.lineHeight = renderer.layerConfig.lineHeight;\n      this.canvasHeight = parent.parent.scrollHeight;\n      this.heightRatio = this.canvasHeight / this.maxHeight;\n      this.canvasWidth = parent.width;\n      this.minDecorationHeight = (2 * this.pixelRatio) | 0;\n      this.halfMinDecorationHeight = (this.minDecorationHeight / 2) | 0;\n      this.canvas.width = this.canvasWidth;\n      this.canvas.height = this.canvasHeight;\n      this.canvas.style.top = 0 + \"px\";\n      this.canvas.style.right = 0 + \"px\";\n      this.canvas.style.zIndex = 7 + \"px\";\n      this.canvas.style.position = \"absolute\";\n      this.colors = {};\n      this.colors.dark = {\n        error: \"rgba(255, 18, 18, 1)\",\n        warning: \"rgba(18, 136, 18, 1)\",\n        info: \"rgba(18, 18, 136, 1)\",\n      };\n      this.colors.light = {\n        error: \"rgb(255,51,51)\",\n        warning: \"rgb(32,133,72)\",\n        info: \"rgb(35,68,138)\",\n      };\n      parent.element.appendChild(this.canvas);\n    }\n    Decorator.prototype.$updateDecorators = function (config) {\n      var colors =\n        this.renderer.theme.isDark === true\n          ? this.colors.dark\n          : this.colors.light;\n      if (config) {\n        this.maxHeight = config.maxHeight;\n        this.lineHeight = config.lineHeight;\n        this.canvasHeight = config.height;\n        var allLineHeight = (config.lastRow + 1) * this.lineHeight;\n        if (allLineHeight < this.canvasHeight) {\n          this.heightRatio = 1;\n        } else {\n          this.heightRatio = this.canvasHeight / this.maxHeight;\n        }\n      }\n      var ctx = this.canvas.getContext(\"2d\");\n      function compare(a, b) {\n        if (a.priority < b.priority) return -1;\n        if (a.priority > b.priority) return 1;\n        return 0;\n      }\n      var annotations = this.renderer.session.$annotations;\n      ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);\n      if (annotations) {\n        var priorities = {\n          info: 1,\n          warning: 2,\n          error: 3,\n        };\n        annotations.forEach(function (item) {\n          item.priority = priorities[item.type] || null;\n        });\n        annotations = annotations.sort(compare);\n        var foldData = this.renderer.session.$foldData;\n        for (var i = 0; i < annotations.length; i++) {\n          var row = annotations[i].row;\n          var compensateFold = this.compensateFoldRows(row, foldData);\n          var currentY = Math.round(\n            (row - compensateFold) * this.lineHeight * this.heightRatio,\n          );\n          var y1 = Math.round(\n            (row - compensateFold) * this.lineHeight * this.heightRatio,\n          );\n          var y2 = Math.round(\n            ((row - compensateFold) * this.lineHeight + this.lineHeight) *\n              this.heightRatio,\n          );\n          var height = y2 - y1;\n          if (height < this.minDecorationHeight) {\n            var yCenter = ((y1 + y2) / 2) | 0;\n            if (yCenter < this.halfMinDecorationHeight) {\n              yCenter = this.halfMinDecorationHeight;\n            } else if (\n              yCenter + this.halfMinDecorationHeight >\n              this.canvasHeight\n            ) {\n              yCenter = this.canvasHeight - this.halfMinDecorationHeight;\n            }\n            y1 = Math.round(yCenter - this.halfMinDecorationHeight);\n            y2 = Math.round(yCenter + this.halfMinDecorationHeight);\n          }\n          ctx.fillStyle = colors[annotations[i].type] || null;\n          ctx.fillRect(0, currentY, this.canvasWidth, y2 - y1);\n        }\n      }\n      var cursor = this.renderer.session.selection.getCursor();\n      if (cursor) {\n        var compensateFold = this.compensateFoldRows(cursor.row, foldData);\n        var currentY = Math.round(\n          (cursor.row - compensateFold) * this.lineHeight * this.heightRatio,\n        );\n        ctx.fillStyle = \"rgba(0, 0, 0, 0.5)\";\n        ctx.fillRect(0, currentY, this.canvasWidth, 2);\n      }\n    };\n    Decorator.prototype.compensateFoldRows = function (row, foldData) {\n      var compensateFold = 0;\n      if (foldData && foldData.length > 0) {\n        for (var j = 0; j < foldData.length; j++) {\n          if (row > foldData[j].start.row && row < foldData[j].end.row) {\n            compensateFold += row - foldData[j].start.row;\n          } else if (row >= foldData[j].end.row) {\n            compensateFold += foldData[j].end.row - foldData[j].start.row;\n          }\n        }\n      }\n      return compensateFold;\n    };\n    return Decorator;\n  })();\n  oop.implement(Decorator.prototype, EventEmitter);\n  exports.Decorator = Decorator;\n});\n\ndefine(\"ace/virtual_renderer\", [\n  \"require\",\n  \"exports\",\n  \"module\",\n  \"ace/lib/oop\",\n  \"ace/lib/dom\",\n  \"ace/lib/lang\",\n  \"ace/config\",\n  \"ace/layer/gutter\",\n  \"ace/layer/marker\",\n  \"ace/layer/text\",\n  \"ace/layer/cursor\",\n  \"ace/scrollbar\",\n  \"ace/scrollbar\",\n  \"ace/scrollbar_custom\",\n  \"ace/scrollbar_custom\",\n  \"ace/renderloop\",\n  \"ace/layer/font_metrics\",\n  \"ace/lib/event_emitter\",\n  \"ace/css/editor-css\",\n  \"ace/layer/decorators\",\n  \"ace/lib/useragent\",\n], function (require, exports, module) {\n  \"use strict\";\n  var oop = require(\"./lib/oop\");\n  var dom = require(\"./lib/dom\");\n  var lang = require(\"./lib/lang\");\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 HScrollBar = require(\"./scrollbar\").HScrollBar;\n  var VScrollBar = require(\"./scrollbar\").VScrollBar;\n  var HScrollBarCustom = require(\"./scrollbar_custom\").HScrollBar;\n  var VScrollBarCustom = require(\"./scrollbar_custom\").VScrollBar;\n  var RenderLoop = require(\"./renderloop\").RenderLoop;\n  var FontMetrics = require(\"./layer/font_metrics\").FontMetrics;\n  var EventEmitter = require(\"./lib/event_emitter\").EventEmitter;\n  var editorCss = require(\"./css/editor-css\");\n  var Decorator = require(\"./layer/decorators\").Decorator;\n  var useragent = require(\"./lib/useragent\");\n  dom.importCssString(editorCss, \"ace_editor.css\", false);\n  var VirtualRenderer = /** @class */ (function () {\n    function VirtualRenderer(container, theme) {\n      var _self = this;\n      this.container = container || dom.createElement(\"div\");\n      dom.addCssClass(this.container, \"ace_editor\");\n      if (dom.HI_DPI) dom.addCssClass(this.container, \"ace_hidpi\");\n      this.setTheme(theme);\n      if (config.get(\"useStrictCSP\") == null) config.set(\"useStrictCSP\", false);\n      this.$gutter = dom.createElement(\"div\");\n      this.$gutter.className = \"ace_gutter\";\n      this.container.appendChild(this.$gutter);\n      this.$gutter.setAttribute(\"aria-hidden\", \"true\");\n      this.scroller = dom.createElement(\"div\");\n      this.scroller.className = \"ace_scroller\";\n      this.container.appendChild(this.scroller);\n      this.content = dom.createElement(\"div\");\n      this.content.className = \"ace_content\";\n      this.scroller.appendChild(this.content);\n      this.$gutterLayer = new GutterLayer(this.$gutter);\n      this.$gutterLayer.on(\"changeGutterWidth\", this.onGutterResize.bind(this));\n      this.$markerBack = new MarkerLayer(this.content);\n      var textLayer = (this.$textLayer = new TextLayer(this.content));\n      this.canvas = textLayer.element;\n      this.$markerFront = new MarkerLayer(this.content);\n      this.$cursorLayer = new CursorLayer(this.content);\n      this.$horizScroll = false;\n      this.$vScroll = false;\n      this.scrollBar = this.scrollBarV = new VScrollBar(this.container, this);\n      this.scrollBarH = new HScrollBar(this.container, this);\n      this.scrollBarV.on(\"scroll\", function (e) {\n        if (!_self.$scrollAnimation)\n          _self.session.setScrollTop(e.data - _self.scrollMargin.top);\n      });\n      this.scrollBarH.on(\"scroll\", function (e) {\n        if (!_self.$scrollAnimation)\n          _self.session.setScrollLeft(e.data - _self.scrollMargin.left);\n      });\n      this.scrollTop = 0;\n      this.scrollLeft = 0;\n      this.cursorPos = {\n        row: 0,\n        column: 0,\n      };\n      this.$fontMetrics = new FontMetrics(this.container);\n      this.$textLayer.$setFontMetrics(this.$fontMetrics);\n      this.$textLayer.on(\"changeCharacterSize\", function (e) {\n        _self.updateCharacterSize();\n        _self.onResize(\n          true,\n          _self.gutterWidth,\n          _self.$size.width,\n          _self.$size.height,\n        );\n        _self._signal(\"changeCharacterSize\", e);\n      });\n      this.$size = {\n        width: 0,\n        height: 0,\n        scrollerHeight: 0,\n        scrollerWidth: 0,\n        $dirty: true,\n      };\n      this.layerConfig = {\n        width: 1,\n        padding: 0,\n        firstRow: 0,\n        firstRowScreen: 0,\n        lastRow: 0,\n        lineHeight: 0,\n        characterWidth: 0,\n        minHeight: 1,\n        maxHeight: 1,\n        offset: 0,\n        height: 1,\n        gutterOffset: 1,\n      };\n      this.scrollMargin = {\n        left: 0,\n        right: 0,\n        top: 0,\n        bottom: 0,\n        v: 0,\n        h: 0,\n      };\n      this.margin = {\n        left: 0,\n        right: 0,\n        top: 0,\n        bottom: 0,\n        v: 0,\n        h: 0,\n      };\n      this.$keepTextAreaAtCursor = !useragent.isIOS;\n      this.$loop = new RenderLoop(\n        this.$renderChanges.bind(this),\n        this.container.ownerDocument.defaultView,\n      );\n      this.$loop.schedule(this.CHANGE_FULL);\n      this.updateCharacterSize();\n      this.setPadding(4);\n      this.$addResizeObserver();\n      config.resetOptions(this);\n      config._signal(\"renderer\", this);\n    }\n    VirtualRenderer.prototype.updateCharacterSize = function () {\n      if (this.$textLayer.allowBoldFonts != this.$allowBoldFonts) {\n        this.$allowBoldFonts = this.$textLayer.allowBoldFonts;\n        this.setStyle(\"ace_nobold\", !this.$allowBoldFonts);\n      }\n      this.layerConfig.characterWidth = this.characterWidth =\n        this.$textLayer.getCharacterWidth();\n      this.layerConfig.lineHeight = this.lineHeight =\n        this.$textLayer.getLineHeight();\n      this.$updatePrintMargin();\n      dom.setStyle(this.scroller.style, \"line-height\", this.lineHeight + \"px\");\n    };\n    VirtualRenderer.prototype.setSession = function (session) {\n      if (this.session)\n        this.session.doc.off(\"changeNewLineMode\", this.onChangeNewLineMode);\n      this.session = session;\n      if (session && this.scrollMargin.top && session.getScrollTop() <= 0)\n        session.setScrollTop(-this.scrollMargin.top);\n      this.$cursorLayer.setSession(session);\n      this.$markerBack.setSession(session);\n      this.$markerFront.setSession(session);\n      this.$gutterLayer.setSession(session);\n      this.$textLayer.setSession(session);\n      if (!session) return;\n      this.$loop.schedule(this.CHANGE_FULL);\n      this.session.$setFontMetrics(this.$fontMetrics);\n      this.scrollBarH.scrollLeft = this.scrollBarV.scrollTop = null;\n      this.onChangeNewLineMode = this.onChangeNewLineMode.bind(this);\n      this.onChangeNewLineMode();\n      this.session.doc.on(\"changeNewLineMode\", this.onChangeNewLineMode);\n    };\n    VirtualRenderer.prototype.updateLines = function (\n      firstRow,\n      lastRow,\n      force,\n    ) {\n      if (lastRow === undefined) lastRow = Infinity;\n      if (!this.$changedLines) {\n        this.$changedLines = {\n          firstRow: firstRow,\n          lastRow: lastRow,\n        };\n      } else {\n        if (this.$changedLines.firstRow > firstRow)\n          this.$changedLines.firstRow = firstRow;\n        if (this.$changedLines.lastRow < lastRow)\n          this.$changedLines.lastRow = lastRow;\n      }\n      if (this.$changedLines.lastRow < this.layerConfig.firstRow) {\n        if (force) this.$changedLines.lastRow = this.layerConfig.lastRow;\n        else return;\n      }\n      if (this.$changedLines.firstRow > this.layerConfig.lastRow) return;\n      this.$loop.schedule(this.CHANGE_LINES);\n    };\n    VirtualRenderer.prototype.onChangeNewLineMode = function () {\n      this.$loop.schedule(this.CHANGE_TEXT);\n      this.$textLayer.$updateEolChar();\n      this.session.$bidiHandler.setEolChar(this.$textLayer.EOL_CHAR);\n    };\n    VirtualRenderer.prototype.onChangeTabSize = function () {\n      this.$loop.schedule(this.CHANGE_TEXT | this.CHANGE_MARKER);\n      this.$textLayer.onChangeTabSize();\n    };\n    VirtualRenderer.prototype.updateText = function () {\n      this.$loop.schedule(this.CHANGE_TEXT);\n    };\n    VirtualRenderer.prototype.updateFull = function (force) {\n      if (force) this.$renderChanges(this.CHANGE_FULL, true);\n      else this.$loop.schedule(this.CHANGE_FULL);\n    };\n    VirtualRenderer.prototype.updateFontSize = function () {\n      this.$textLayer.checkForSizeChanges();\n    };\n    VirtualRenderer.prototype.$updateSizeAsync = function () {\n      if (this.$loop.pending) this.$size.$dirty = true;\n      else this.onResize();\n    };\n    VirtualRenderer.prototype.onResize = function (\n      force,\n      gutterWidth,\n      width,\n      height,\n    ) {\n      if (this.resizing > 2) return;\n      else if (this.resizing > 0) this.resizing++;\n      else this.resizing = force ? 1 : 0;\n      var el = this.container;\n      if (!height) height = el.clientHeight || el.scrollHeight;\n      if (!width) width = el.clientWidth || el.scrollWidth;\n      var changes = this.$updateCachedSize(force, gutterWidth, width, height);\n      if (this.$resizeTimer) this.$resizeTimer.cancel();\n      if (!this.$size.scrollerHeight || (!width && !height))\n        return (this.resizing = 0);\n      if (force) this.$gutterLayer.$padding = null;\n      if (force) this.$renderChanges(changes | this.$changes, true);\n      else this.$loop.schedule(changes | this.$changes);\n      if (this.resizing) this.resizing = 0;\n      this.scrollBarH.scrollLeft = this.scrollBarV.scrollTop = null;\n      if (this.$customScrollbar) {\n        this.$updateCustomScrollbar(true);\n      }\n    };\n    VirtualRenderer.prototype.$updateCachedSize = function (\n      force,\n      gutterWidth,\n      width,\n      height,\n    ) {\n      height -= this.$extraHeight || 0;\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        size.scrollerHeight = size.height;\n        if (this.$horizScroll)\n          size.scrollerHeight -= this.scrollBarH.getHeight();\n        this.scrollBarV.setHeight(size.scrollerHeight);\n        this.scrollBarV.element.style.bottom =\n          this.scrollBarH.getHeight() + \"px\";\n        changes = changes | this.CHANGE_SCROLL;\n      }\n      if (width && (force || size.width != width)) {\n        changes |= this.CHANGE_SIZE;\n        size.width = width;\n        if (gutterWidth == null)\n          gutterWidth = this.$showGutter ? this.$gutter.offsetWidth : 0;\n        this.gutterWidth = gutterWidth;\n        dom.setStyle(this.scrollBarH.element.style, \"left\", gutterWidth + \"px\");\n        dom.setStyle(\n          this.scroller.style,\n          \"left\",\n          gutterWidth + this.margin.left + \"px\",\n        );\n        size.scrollerWidth = Math.max(\n          0,\n          width - gutterWidth - this.scrollBarV.getWidth() - this.margin.h,\n        );\n        dom.setStyle(this.$gutter.style, \"left\", this.margin.left + \"px\");\n        var right = this.scrollBarV.getWidth() + \"px\";\n        dom.setStyle(this.scrollBarH.element.style, \"right\", right);\n        dom.setStyle(this.scroller.style, \"right\", right);\n        dom.setStyle(\n          this.scroller.style,\n          \"bottom\",\n          this.scrollBarH.getHeight(),\n        );\n        this.scrollBarH.setWidth(size.scrollerWidth);\n        if (\n          (this.session &&\n            this.session.getUseWrapMode() &&\n            this.adjustWrapLimit()) ||\n          force\n        ) {\n          changes |= this.CHANGE_FULL;\n        }\n      }\n      size.$dirty = !width || !height;\n      if (changes) this._signal(\"resize\", oldSize);\n      return changes;\n    };\n    VirtualRenderer.prototype.onGutterResize = function (width) {\n      var gutterWidth = this.$showGutter ? width : 0;\n      if (gutterWidth != this.gutterWidth)\n        this.$changes |= this.$updateCachedSize(\n          true,\n          gutterWidth,\n          this.$size.width,\n          this.$size.height,\n        );\n      if (this.session.getUseWrapMode() && this.adjustWrapLimit()) {\n        this.$loop.schedule(this.CHANGE_FULL);\n      } else if (this.$size.$dirty) {\n        this.$loop.schedule(this.CHANGE_FULL);\n      } else {\n        this.$computeLayerConfig();\n      }\n    };\n    VirtualRenderer.prototype.adjustWrapLimit = function () {\n      var availableWidth = this.$size.scrollerWidth - this.$padding * 2;\n      var limit = Math.floor(availableWidth / this.characterWidth);\n      return this.session.adjustWrapLimit(\n        limit,\n        this.$showPrintMargin && this.$printMarginColumn,\n      );\n    };\n    VirtualRenderer.prototype.setAnimatedScroll = function (shouldAnimate) {\n      this.setOption(\"animatedScroll\", shouldAnimate);\n    };\n    VirtualRenderer.prototype.getAnimatedScroll = function () {\n      return this.$animatedScroll;\n    };\n    VirtualRenderer.prototype.setShowInvisibles = function (showInvisibles) {\n      this.setOption(\"showInvisibles\", showInvisibles);\n      this.session.$bidiHandler.setShowInvisibles(showInvisibles);\n    };\n    VirtualRenderer.prototype.getShowInvisibles = function () {\n      return this.getOption(\"showInvisibles\");\n    };\n    VirtualRenderer.prototype.getDisplayIndentGuides = function () {\n      return this.getOption(\"displayIndentGuides\");\n    };\n    VirtualRenderer.prototype.setDisplayIndentGuides = function (display) {\n      this.setOption(\"displayIndentGuides\", display);\n    };\n    VirtualRenderer.prototype.getHighlightIndentGuides = function () {\n      return this.getOption(\"highlightIndentGuides\");\n    };\n    VirtualRenderer.prototype.setHighlightIndentGuides = function (highlight) {\n      this.setOption(\"highlightIndentGuides\", highlight);\n    };\n    VirtualRenderer.prototype.setShowPrintMargin = function (showPrintMargin) {\n      this.setOption(\"showPrintMargin\", showPrintMargin);\n    };\n    VirtualRenderer.prototype.getShowPrintMargin = function () {\n      return this.getOption(\"showPrintMargin\");\n    };\n    VirtualRenderer.prototype.setPrintMarginColumn = function (\n      printMarginColumn,\n    ) {\n      this.setOption(\"printMarginColumn\", printMarginColumn);\n    };\n    VirtualRenderer.prototype.getPrintMarginColumn = function () {\n      return this.getOption(\"printMarginColumn\");\n    };\n    VirtualRenderer.prototype.getShowGutter = function () {\n      return this.getOption(\"showGutter\");\n    };\n    VirtualRenderer.prototype.setShowGutter = function (show) {\n      return this.setOption(\"showGutter\", show);\n    };\n    VirtualRenderer.prototype.getFadeFoldWidgets = function () {\n      return this.getOption(\"fadeFoldWidgets\");\n    };\n    VirtualRenderer.prototype.setFadeFoldWidgets = function (show) {\n      this.setOption(\"fadeFoldWidgets\", show);\n    };\n    VirtualRenderer.prototype.setHighlightGutterLine = function (\n      shouldHighlight,\n    ) {\n      this.setOption(\"highlightGutterLine\", shouldHighlight);\n    };\n    VirtualRenderer.prototype.getHighlightGutterLine = function () {\n      return this.getOption(\"highlightGutterLine\");\n    };\n    VirtualRenderer.prototype.$updatePrintMargin = function () {\n      if (!this.$showPrintMargin && !this.$printMarginEl) return;\n      if (!this.$printMarginEl) {\n        var containerEl = dom.createElement(\"div\");\n        containerEl.className = \"ace_layer ace_print-margin-layer\";\n        this.$printMarginEl = dom.createElement(\"div\");\n        this.$printMarginEl.className = \"ace_print-margin\";\n        containerEl.appendChild(this.$printMarginEl);\n        this.content.insertBefore(containerEl, this.content.firstChild);\n      }\n      var style = this.$printMarginEl.style;\n      style.left =\n        Math.round(\n          this.characterWidth * this.$printMarginColumn + this.$padding,\n        ) + \"px\";\n      style.visibility = this.$showPrintMargin ? \"visible\" : \"hidden\";\n      if (this.session && this.session.$wrap == -1) this.adjustWrapLimit();\n    };\n    VirtualRenderer.prototype.getContainerElement = function () {\n      return this.container;\n    };\n    VirtualRenderer.prototype.getMouseEventTarget = function () {\n      return this.scroller;\n    };\n    VirtualRenderer.prototype.getTextAreaContainer = function () {\n      return this.container;\n    };\n    VirtualRenderer.prototype.$moveTextAreaToCursor = function () {\n      if (this.$isMousePressed) return;\n      var style = this.textarea.style;\n      var composition = this.$composition;\n      if (!this.$keepTextAreaAtCursor && !composition) {\n        dom.translate(this.textarea, -100, 0);\n        return;\n      }\n      var pixelPos = this.$cursorLayer.$pixelPos;\n      if (!pixelPos) return;\n      if (composition && composition.markerRange)\n        pixelPos = this.$cursorLayer.getPixelPosition(\n          composition.markerRange.start,\n          true,\n        );\n      var config = this.layerConfig;\n      var posTop = pixelPos.top;\n      var posLeft = pixelPos.left;\n      posTop -= config.offset;\n      var h =\n        (composition && composition.useTextareaForIME) || useragent.isMobile\n          ? this.lineHeight\n          : 1;\n      if (posTop < 0 || posTop > config.height - h) {\n        dom.translate(this.textarea, 0, 0);\n        return;\n      }\n      var w = 1;\n      var maxTop = this.$size.height - h;\n      if (!composition) {\n        posTop += this.lineHeight;\n      } else {\n        if (composition.useTextareaForIME) {\n          var val = this.textarea.value;\n          w = this.characterWidth * this.session.$getStringScreenWidth(val)[0];\n        } else {\n          posTop += this.lineHeight + 2;\n        }\n      }\n      posLeft -= this.scrollLeft;\n      if (posLeft > this.$size.scrollerWidth - w)\n        posLeft = this.$size.scrollerWidth - w;\n      posLeft += this.gutterWidth + this.margin.left;\n      dom.setStyle(style, \"height\", h + \"px\");\n      dom.setStyle(style, \"width\", w + \"px\");\n      dom.translate(\n        this.textarea,\n        Math.min(posLeft, this.$size.scrollerWidth - w),\n        Math.min(posTop, maxTop),\n      );\n    };\n    VirtualRenderer.prototype.getFirstVisibleRow = function () {\n      return this.layerConfig.firstRow;\n    };\n    VirtualRenderer.prototype.getFirstFullyVisibleRow = function () {\n      return (\n        this.layerConfig.firstRow + (this.layerConfig.offset === 0 ? 0 : 1)\n      );\n    };\n    VirtualRenderer.prototype.getLastFullyVisibleRow = function () {\n      var config = this.layerConfig;\n      var lastRow = config.lastRow;\n      var top =\n        this.session.documentToScreenRow(lastRow, 0) * config.lineHeight;\n      if (top - this.session.getScrollTop() > config.height - config.lineHeight)\n        return lastRow - 1;\n      return lastRow;\n    };\n    VirtualRenderer.prototype.getLastVisibleRow = function () {\n      return this.layerConfig.lastRow;\n    };\n    VirtualRenderer.prototype.setPadding = function (padding) {\n      this.$padding = padding;\n      this.$textLayer.setPadding(padding);\n      this.$cursorLayer.setPadding(padding);\n      this.$markerFront.setPadding(padding);\n      this.$markerBack.setPadding(padding);\n      this.$loop.schedule(this.CHANGE_FULL);\n      this.$updatePrintMargin();\n    };\n    VirtualRenderer.prototype.setScrollMargin = function (\n      top,\n      bottom,\n      left,\n      right,\n    ) {\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      if (sm.top && this.scrollTop <= 0 && this.session)\n        this.session.setScrollTop(-sm.top);\n      this.updateFull();\n    };\n    VirtualRenderer.prototype.setMargin = function (top, bottom, left, right) {\n      var sm = this.margin;\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.$updateCachedSize(\n        true,\n        this.gutterWidth,\n        this.$size.width,\n        this.$size.height,\n      );\n      this.updateFull();\n    };\n    VirtualRenderer.prototype.getHScrollBarAlwaysVisible = function () {\n      return this.$hScrollBarAlwaysVisible;\n    };\n    VirtualRenderer.prototype.setHScrollBarAlwaysVisible = function (\n      alwaysVisible,\n    ) {\n      this.setOption(\"hScrollBarAlwaysVisible\", alwaysVisible);\n    };\n    VirtualRenderer.prototype.getVScrollBarAlwaysVisible = function () {\n      return this.$vScrollBarAlwaysVisible;\n    };\n    VirtualRenderer.prototype.setVScrollBarAlwaysVisible = function (\n      alwaysVisible,\n    ) {\n      this.setOption(\"vScrollBarAlwaysVisible\", alwaysVisible);\n    };\n    VirtualRenderer.prototype.$updateScrollBarV = function () {\n      var scrollHeight = this.layerConfig.maxHeight;\n      var scrollerHeight = this.$size.scrollerHeight;\n      if (!this.$maxLines && this.$scrollPastEnd) {\n        scrollHeight -=\n          (scrollerHeight - this.lineHeight) * this.$scrollPastEnd;\n        if (this.scrollTop > scrollHeight - scrollerHeight) {\n          scrollHeight = this.scrollTop + scrollerHeight;\n          this.scrollBarV.scrollTop = null;\n        }\n      }\n      this.scrollBarV.setScrollHeight(scrollHeight + this.scrollMargin.v);\n      this.scrollBarV.setScrollTop(this.scrollTop + this.scrollMargin.top);\n    };\n    VirtualRenderer.prototype.$updateScrollBarH = function () {\n      this.scrollBarH.setScrollWidth(\n        this.layerConfig.width + 2 * this.$padding + this.scrollMargin.h,\n      );\n      this.scrollBarH.setScrollLeft(this.scrollLeft + this.scrollMargin.left);\n    };\n    VirtualRenderer.prototype.freeze = function () {\n      this.$frozen = true;\n    };\n    VirtualRenderer.prototype.unfreeze = function () {\n      this.$frozen = false;\n    };\n    VirtualRenderer.prototype.$renderChanges = function (changes, force) {\n      if (this.$changes) {\n        changes |= this.$changes;\n        this.$changes = 0;\n      }\n      if (\n        !this.session ||\n        !this.container.offsetWidth ||\n        this.$frozen ||\n        (!changes && !force)\n      ) {\n        this.$changes |= changes;\n        return;\n      }\n      if (this.$size.$dirty) {\n        this.$changes |= changes;\n        return this.onResize(true);\n      }\n      if (!this.lineHeight) {\n        this.$textLayer.checkForSizeChanges();\n      }\n      this._signal(\"beforeRender\", changes);\n      if (this.session && this.session.$bidiHandler)\n        this.session.$bidiHandler.updateCharacterWidths(this.$fontMetrics);\n      var config = this.layerConfig;\n      if (\n        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_H_SCROLL\n      ) {\n        changes |= this.$computeLayerConfig() | this.$loop.clear();\n        if (\n          config.firstRow != this.layerConfig.firstRow &&\n          config.firstRowScreen == this.layerConfig.firstRowScreen\n        ) {\n          var st =\n            this.scrollTop +\n            (config.firstRow - Math.max(this.layerConfig.firstRow, 0)) *\n              this.lineHeight;\n          if (st > 0) {\n            this.scrollTop = st;\n            changes = changes | this.CHANGE_SCROLL;\n            changes |= this.$computeLayerConfig() | this.$loop.clear();\n          }\n        }\n        config = this.layerConfig;\n        this.$updateScrollBarV();\n        if (changes & this.CHANGE_H_SCROLL) this.$updateScrollBarH();\n        dom.translate(this.content, -this.scrollLeft, -config.offset);\n        var width = config.width + 2 * this.$padding + \"px\";\n        var height = config.minHeight + \"px\";\n        dom.setStyle(this.content.style, \"width\", width);\n        dom.setStyle(this.content.style, \"height\", height);\n      }\n      if (changes & this.CHANGE_H_SCROLL) {\n        dom.translate(this.content, -this.scrollLeft, -config.offset);\n        this.scroller.className =\n          this.scrollLeft <= 0\n            ? \"ace_scroller \"\n            : \"ace_scroller ace_scroll-left \";\n        if (this.enableKeyboardAccessibility)\n          this.scroller.className += this.keyboardFocusClassName;\n      }\n      if (changes & this.CHANGE_FULL) {\n        this.$changedLines = null;\n        this.$textLayer.update(config);\n        if (this.$showGutter) this.$gutterLayer.update(config);\n        if (this.$customScrollbar) {\n          this.$scrollDecorator.$updateDecorators(config);\n        }\n        this.$markerBack.update(config);\n        this.$markerFront.update(config);\n        this.$cursorLayer.update(config);\n        this.$moveTextAreaToCursor();\n        this._signal(\"afterRender\", changes);\n        return;\n      }\n      if (changes & this.CHANGE_SCROLL) {\n        this.$changedLines = null;\n        if (changes & this.CHANGE_TEXT || changes & this.CHANGE_LINES)\n          this.$textLayer.update(config);\n        else this.$textLayer.scrollLines(config);\n        if (this.$showGutter) {\n          if (changes & this.CHANGE_GUTTER || changes & this.CHANGE_LINES)\n            this.$gutterLayer.update(config);\n          else this.$gutterLayer.scrollLines(config);\n        }\n        if (this.$customScrollbar) {\n          this.$scrollDecorator.$updateDecorators(config);\n        }\n        this.$markerBack.update(config);\n        this.$markerFront.update(config);\n        this.$cursorLayer.update(config);\n        this.$moveTextAreaToCursor();\n        this._signal(\"afterRender\", changes);\n        return;\n      }\n      if (changes & this.CHANGE_TEXT) {\n        this.$changedLines = null;\n        this.$textLayer.update(config);\n        if (this.$showGutter) this.$gutterLayer.update(config);\n        if (this.$customScrollbar) {\n          this.$scrollDecorator.$updateDecorators(config);\n        }\n      } else if (changes & this.CHANGE_LINES) {\n        if (\n          this.$updateLines() ||\n          (changes & this.CHANGE_GUTTER && this.$showGutter)\n        )\n          this.$gutterLayer.update(config);\n        if (this.$customScrollbar) {\n          this.$scrollDecorator.$updateDecorators(config);\n        }\n      } else if (changes & this.CHANGE_TEXT || changes & this.CHANGE_GUTTER) {\n        if (this.$showGutter) this.$gutterLayer.update(config);\n        if (this.$customScrollbar) {\n          this.$scrollDecorator.$updateDecorators(config);\n        }\n      } else if (changes & this.CHANGE_CURSOR) {\n        if (this.$highlightGutterLine)\n          this.$gutterLayer.updateLineHighlight(config);\n        if (this.$customScrollbar) {\n          this.$scrollDecorator.$updateDecorators(config);\n        }\n      }\n      if (changes & this.CHANGE_CURSOR) {\n        this.$cursorLayer.update(config);\n        this.$moveTextAreaToCursor();\n      }\n      if (changes & (this.CHANGE_MARKER | this.CHANGE_MARKER_FRONT)) {\n        this.$markerFront.update(config);\n      }\n      if (changes & (this.CHANGE_MARKER | this.CHANGE_MARKER_BACK)) {\n        this.$markerBack.update(config);\n      }\n      this._signal(\"afterRender\", changes);\n    };\n    VirtualRenderer.prototype.$autosize = function () {\n      var height = this.session.getScreenLength() * this.lineHeight;\n      var maxHeight = this.$maxLines * this.lineHeight;\n      var desiredHeight =\n        Math.min(\n          maxHeight,\n          Math.max((this.$minLines || 1) * this.lineHeight, height),\n        ) +\n        this.scrollMargin.v +\n        (this.$extraHeight || 0);\n      if (this.$horizScroll) desiredHeight += this.scrollBarH.getHeight();\n      if (this.$maxPixelHeight && desiredHeight > this.$maxPixelHeight)\n        desiredHeight = this.$maxPixelHeight;\n      var hideScrollbars = desiredHeight <= 2 * this.lineHeight;\n      var vScroll = !hideScrollbars && height > maxHeight;\n      if (\n        desiredHeight != this.desiredHeight ||\n        this.$size.height != this.desiredHeight ||\n        vScroll != this.$vScroll\n      ) {\n        if (vScroll != this.$vScroll) {\n          this.$vScroll = vScroll;\n          this.scrollBarV.setVisible(vScroll);\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        this._signal(\"autosize\");\n      }\n    };\n    VirtualRenderer.prototype.$computeLayerConfig = function () {\n      var session = this.session;\n      var size = this.$size;\n      var hideScrollbars = size.height <= 2 * this.lineHeight;\n      var screenLines = this.session.getScreenLength();\n      var maxHeight = screenLines * this.lineHeight;\n      var longestLine = this.$getLongestLine();\n      var horizScroll =\n        !hideScrollbars &&\n        (this.$hScrollBarAlwaysVisible ||\n          size.scrollerWidth - longestLine - 2 * this.$padding < 0);\n      var hScrollChanged = this.$horizScroll !== horizScroll;\n      if (hScrollChanged) {\n        this.$horizScroll = horizScroll;\n        this.scrollBarH.setVisible(horizScroll);\n      }\n      var vScrollBefore = this.$vScroll; // autosize can change vscroll value in which case we need to update longestLine\n      if (this.$maxLines && this.lineHeight > 1) this.$autosize();\n      var minHeight = size.scrollerHeight + this.lineHeight;\n      var scrollPastEnd =\n        !this.$maxLines && this.$scrollPastEnd\n          ? (size.scrollerHeight - this.lineHeight) * this.$scrollPastEnd\n          : 0;\n      maxHeight += scrollPastEnd;\n      var sm = this.scrollMargin;\n      this.session.setScrollTop(\n        Math.max(\n          -sm.top,\n          Math.min(this.scrollTop, maxHeight - size.scrollerHeight + sm.bottom),\n        ),\n      );\n      this.session.setScrollLeft(\n        Math.max(\n          -sm.left,\n          Math.min(\n            this.scrollLeft,\n            longestLine + 2 * this.$padding - size.scrollerWidth + sm.right,\n          ),\n        ),\n      );\n      var vScroll =\n        !hideScrollbars &&\n        (this.$vScrollBarAlwaysVisible ||\n          size.scrollerHeight - maxHeight + scrollPastEnd < 0 ||\n          this.scrollTop > sm.top);\n      var vScrollChanged = vScrollBefore !== vScroll;\n      if (vScrollChanged) {\n        this.$vScroll = vScroll;\n        this.scrollBarV.setVisible(vScroll);\n      }\n      var offset = this.scrollTop % this.lineHeight;\n      var lineCount = Math.ceil(minHeight / this.lineHeight) - 1;\n      var firstRow = Math.max(\n        0,\n        Math.round((this.scrollTop - offset) / this.lineHeight),\n      );\n      var lastRow = firstRow + lineCount;\n      var firstRowScreen, firstRowHeight;\n      var lineHeight = this.lineHeight;\n      firstRow = session.screenToDocumentRow(firstRow, 0);\n      var foldLine = session.getFoldLine(firstRow);\n      if (foldLine) {\n        firstRow = foldLine.start.row;\n      }\n      firstRowScreen = session.documentToScreenRow(firstRow, 0);\n      firstRowHeight = session.getRowLength(firstRow) * lineHeight;\n      lastRow = Math.min(\n        session.screenToDocumentRow(lastRow, 0),\n        session.getLength() - 1,\n      );\n      minHeight =\n        size.scrollerHeight +\n        session.getRowLength(lastRow) * lineHeight +\n        firstRowHeight;\n      offset = this.scrollTop - firstRowScreen * lineHeight;\n      var changes = 0;\n      if (this.layerConfig.width != longestLine || hScrollChanged)\n        changes = this.CHANGE_H_SCROLL;\n      if (hScrollChanged || vScrollChanged) {\n        changes |= this.$updateCachedSize(\n          true,\n          this.gutterWidth,\n          size.width,\n          size.height,\n        );\n        this._signal(\"scrollbarVisibilityChanged\");\n        if (vScrollChanged) longestLine = this.$getLongestLine();\n      }\n      this.layerConfig = {\n        width: longestLine,\n        padding: this.$padding,\n        firstRow: firstRow,\n        firstRowScreen: firstRowScreen,\n        lastRow: lastRow,\n        lineHeight: lineHeight,\n        characterWidth: this.characterWidth,\n        minHeight: minHeight,\n        maxHeight: maxHeight,\n        offset: offset,\n        gutterOffset: lineHeight\n          ? Math.max(\n              0,\n              Math.ceil(\n                (offset + size.height - size.scrollerHeight) / lineHeight,\n              ),\n            )\n          : 0,\n        height: this.$size.scrollerHeight,\n      };\n      if (this.session.$bidiHandler)\n        this.session.$bidiHandler.setContentWidth(longestLine - this.$padding);\n      return changes;\n    };\n    VirtualRenderer.prototype.$updateLines = function () {\n      if (!this.$changedLines) return;\n      var firstRow = this.$changedLines.firstRow;\n      var lastRow = this.$changedLines.lastRow;\n      this.$changedLines = null;\n      var layerConfig = this.layerConfig;\n      if (firstRow > layerConfig.lastRow + 1) {\n        return;\n      }\n      if (lastRow < layerConfig.firstRow) {\n        return;\n      }\n      if (lastRow === Infinity) {\n        if (this.$showGutter) this.$gutterLayer.update(layerConfig);\n        this.$textLayer.update(layerConfig);\n        return;\n      }\n      this.$textLayer.updateLines(layerConfig, firstRow, lastRow);\n      return true;\n    };\n    VirtualRenderer.prototype.$getLongestLine = function () {\n      var charCount = this.session.getScreenWidth();\n      if (this.showInvisibles && !this.session.$useWrapMode) charCount += 1;\n      if (this.$textLayer && charCount > this.$textLayer.MAX_LINE_LENGTH)\n        charCount = this.$textLayer.MAX_LINE_LENGTH + 30;\n      return Math.max(\n        this.$size.scrollerWidth - 2 * this.$padding,\n        Math.round(charCount * this.characterWidth),\n      );\n    };\n    VirtualRenderer.prototype.updateFrontMarkers = function () {\n      this.$markerFront.setMarkers(this.session.getMarkers(true));\n      this.$loop.schedule(this.CHANGE_MARKER_FRONT);\n    };\n    VirtualRenderer.prototype.updateBackMarkers = function () {\n      this.$markerBack.setMarkers(this.session.getMarkers());\n      this.$loop.schedule(this.CHANGE_MARKER_BACK);\n    };\n    VirtualRenderer.prototype.addGutterDecoration = function (row, className) {\n      this.$gutterLayer.addGutterDecoration(row, className);\n    };\n    VirtualRenderer.prototype.removeGutterDecoration = function (\n      row,\n      className,\n    ) {\n      this.$gutterLayer.removeGutterDecoration(row, className);\n    };\n    VirtualRenderer.prototype.updateBreakpoints = function (rows) {\n      this._rows = rows;\n      this.$loop.schedule(this.CHANGE_GUTTER);\n    };\n    VirtualRenderer.prototype.setAnnotations = function (annotations) {\n      this.$gutterLayer.setAnnotations(annotations);\n      this.$loop.schedule(this.CHANGE_GUTTER);\n    };\n    VirtualRenderer.prototype.updateCursor = function () {\n      this.$loop.schedule(this.CHANGE_CURSOR);\n    };\n    VirtualRenderer.prototype.hideCursor = function () {\n      this.$cursorLayer.hideCursor();\n    };\n    VirtualRenderer.prototype.showCursor = function () {\n      this.$cursorLayer.showCursor();\n    };\n    VirtualRenderer.prototype.scrollSelectionIntoView = function (\n      anchor,\n      lead,\n      offset,\n    ) {\n      this.scrollCursorIntoView(anchor, offset);\n      this.scrollCursorIntoView(lead, offset);\n    };\n    VirtualRenderer.prototype.scrollCursorIntoView = function (\n      cursor,\n      offset,\n      $viewMargin,\n    ) {\n      if (this.$size.scrollerHeight === 0) return;\n      var pos = this.$cursorLayer.getPixelPosition(cursor);\n      var newLeft = pos.left;\n      var newTop = pos.top;\n      var topMargin = ($viewMargin && $viewMargin.top) || 0;\n      var bottomMargin = ($viewMargin && $viewMargin.bottom) || 0;\n      if (this.$scrollAnimation) {\n        this.$stopAnimation = true;\n      }\n      var currentTop = this.$scrollAnimation\n        ? this.session.getScrollTop()\n        : this.scrollTop;\n      if (currentTop + topMargin > newTop) {\n        if (offset && currentTop + topMargin > newTop + this.lineHeight)\n          newTop -= offset * this.$size.scrollerHeight;\n        if (newTop === 0) newTop = -this.scrollMargin.top;\n        this.session.setScrollTop(newTop);\n      } else if (\n        currentTop + this.$size.scrollerHeight - bottomMargin <\n        newTop + this.lineHeight\n      ) {\n        if (\n          offset &&\n          currentTop + this.$size.scrollerHeight - bottomMargin <\n            newTop - this.lineHeight\n        )\n          newTop += offset * this.$size.scrollerHeight;\n        this.session.setScrollTop(\n          newTop + this.lineHeight + bottomMargin - this.$size.scrollerHeight,\n        );\n      }\n      var currentLeft = this.scrollLeft;\n      var twoCharsWidth = 2 * this.layerConfig.characterWidth;\n      if (newLeft - twoCharsWidth < currentLeft) {\n        newLeft -= twoCharsWidth;\n        if (newLeft < this.$padding + twoCharsWidth) {\n          newLeft = -this.scrollMargin.left;\n        }\n        this.session.setScrollLeft(newLeft);\n      } else {\n        newLeft += twoCharsWidth;\n        if (\n          currentLeft + this.$size.scrollerWidth <\n          newLeft + this.characterWidth\n        ) {\n          this.session.setScrollLeft(\n            Math.round(\n              newLeft + this.characterWidth - this.$size.scrollerWidth,\n            ),\n          );\n        } else if (\n          currentLeft <= this.$padding &&\n          newLeft - currentLeft < this.characterWidth\n        ) {\n          this.session.setScrollLeft(0);\n        }\n      }\n    };\n    VirtualRenderer.prototype.getScrollTop = function () {\n      return this.session.getScrollTop();\n    };\n    VirtualRenderer.prototype.getScrollLeft = function () {\n      return this.session.getScrollLeft();\n    };\n    VirtualRenderer.prototype.getScrollTopRow = function () {\n      return this.scrollTop / this.lineHeight;\n    };\n    VirtualRenderer.prototype.getScrollBottomRow = function () {\n      return Math.max(\n        0,\n        Math.floor(\n          (this.scrollTop + this.$size.scrollerHeight) / this.lineHeight,\n        ) - 1,\n      );\n    };\n    VirtualRenderer.prototype.scrollToRow = function (row) {\n      this.session.setScrollTop(row * this.lineHeight);\n    };\n    VirtualRenderer.prototype.alignCursor = function (cursor, alignment) {\n      if (typeof cursor == \"number\") cursor = { row: cursor, column: 0 };\n      var pos = this.$cursorLayer.getPixelPosition(cursor);\n      var h = this.$size.scrollerHeight - this.lineHeight;\n      var offset = pos.top - h * (alignment || 0);\n      this.session.setScrollTop(offset);\n      return offset;\n    };\n    VirtualRenderer.prototype.$calcSteps = function (fromValue, toValue) {\n      var i = 0;\n      var l = this.STEPS;\n      var steps = [];\n      var func = function (t, x_min, dx) {\n        return dx * (Math.pow(t - 1, 3) + 1) + x_min;\n      };\n      for (i = 0; i < l; ++i)\n        steps.push(func(i / this.STEPS, fromValue, toValue - fromValue));\n      return steps;\n    };\n    VirtualRenderer.prototype.scrollToLine = function (\n      line,\n      center,\n      animate,\n      callback,\n    ) {\n      var pos = this.$cursorLayer.getPixelPosition({ row: line, column: 0 });\n      var offset = pos.top;\n      if (center) offset -= this.$size.scrollerHeight / 2;\n      var initialScroll = this.scrollTop;\n      this.session.setScrollTop(offset);\n      if (animate !== false) this.animateScrolling(initialScroll, callback);\n    };\n    VirtualRenderer.prototype.animateScrolling = function (\n      fromValue,\n      callback,\n    ) {\n      var toValue = this.scrollTop;\n      if (!this.$animatedScroll) return;\n      var _self = this;\n      if (fromValue == toValue) return;\n      if (this.$scrollAnimation) {\n        var oldSteps = this.$scrollAnimation.steps;\n        if (oldSteps.length) {\n          fromValue = oldSteps[0];\n          if (fromValue == toValue) return;\n        }\n      }\n      var steps = _self.$calcSteps(fromValue, toValue);\n      this.$scrollAnimation = { from: fromValue, to: toValue, steps: steps };\n      clearInterval(this.$timer);\n      _self.session.setScrollTop(steps.shift());\n      _self.session.$scrollTop = toValue;\n      function endAnimation() {\n        _self.$timer = clearInterval(_self.$timer);\n        _self.$scrollAnimation = null;\n        _self.$stopAnimation = false;\n        callback && callback();\n      }\n      this.$timer = setInterval(function () {\n        if (_self.$stopAnimation) {\n          endAnimation();\n          return;\n        }\n        if (!_self.session) return clearInterval(_self.$timer);\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          endAnimation();\n        }\n      }, 10);\n    };\n    VirtualRenderer.prototype.scrollToY = function (scrollTop) {\n      if (this.scrollTop !== scrollTop) {\n        this.$loop.schedule(this.CHANGE_SCROLL);\n        this.scrollTop = scrollTop;\n      }\n    };\n    VirtualRenderer.prototype.scrollToX = function (scrollLeft) {\n      if (this.scrollLeft !== scrollLeft) this.scrollLeft = scrollLeft;\n      this.$loop.schedule(this.CHANGE_H_SCROLL);\n    };\n    VirtualRenderer.prototype.scrollTo = function (x, y) {\n      this.session.setScrollTop(y);\n      this.session.setScrollLeft(x);\n    };\n    VirtualRenderer.prototype.scrollBy = function (deltaX, deltaY) {\n      deltaY && this.session.setScrollTop(this.session.getScrollTop() + deltaY);\n      deltaX &&\n        this.session.setScrollLeft(this.session.getScrollLeft() + deltaX);\n    };\n    VirtualRenderer.prototype.isScrollableBy = function (deltaX, deltaY) {\n      if (\n        deltaY < 0 &&\n        this.session.getScrollTop() >= 1 - this.scrollMargin.top\n      )\n        return true;\n      if (\n        deltaY > 0 &&\n        this.session.getScrollTop() +\n          this.$size.scrollerHeight -\n          this.layerConfig.maxHeight <\n          -1 + this.scrollMargin.bottom\n      )\n        return true;\n      if (\n        deltaX < 0 &&\n        this.session.getScrollLeft() >= 1 - this.scrollMargin.left\n      )\n        return true;\n      if (\n        deltaX > 0 &&\n        this.session.getScrollLeft() +\n          this.$size.scrollerWidth -\n          this.layerConfig.width <\n          -1 + this.scrollMargin.right\n      )\n        return true;\n    };\n    VirtualRenderer.prototype.pixelToScreenCoordinates = function (x, y) {\n      var canvasPos;\n      if (this.$hasCssTransforms) {\n        canvasPos = { top: 0, left: 0 };\n        var p = this.$fontMetrics.transformCoordinates([x, y]);\n        x = p[1] - this.gutterWidth - this.margin.left;\n        y = p[0];\n      } else {\n        canvasPos = this.scroller.getBoundingClientRect();\n      }\n      var offsetX = x + this.scrollLeft - canvasPos.left - this.$padding;\n      var offset = offsetX / this.characterWidth;\n      var row = Math.floor(\n        (y + this.scrollTop - canvasPos.top) / this.lineHeight,\n      );\n      var col = this.$blockCursor ? Math.floor(offset) : Math.round(offset);\n      return {\n        row: row,\n        column: col,\n        side: offset - col > 0 ? 1 : -1,\n        offsetX: offsetX,\n      };\n    };\n    VirtualRenderer.prototype.screenToTextCoordinates = function (x, y) {\n      var canvasPos;\n      if (this.$hasCssTransforms) {\n        canvasPos = { top: 0, left: 0 };\n        var p = this.$fontMetrics.transformCoordinates([x, y]);\n        x = p[1] - this.gutterWidth - this.margin.left;\n        y = p[0];\n      } else {\n        canvasPos = this.scroller.getBoundingClientRect();\n      }\n      var offsetX = x + this.scrollLeft - canvasPos.left - this.$padding;\n      var offset = offsetX / this.characterWidth;\n      var col = this.$blockCursor ? Math.floor(offset) : Math.round(offset);\n      var row = Math.floor(\n        (y + this.scrollTop - canvasPos.top) / this.lineHeight,\n      );\n      return this.session.screenToDocumentPosition(\n        row,\n        Math.max(col, 0),\n        offsetX,\n      );\n    };\n    VirtualRenderer.prototype.textToScreenCoordinates = function (row, column) {\n      var canvasPos = this.scroller.getBoundingClientRect();\n      var pos = this.session.documentToScreenPosition(row, column);\n      var x =\n        this.$padding +\n        (this.session.$bidiHandler.isBidiRow(pos.row, row)\n          ? this.session.$bidiHandler.getPosLeft(pos.column)\n          : Math.round(pos.column * this.characterWidth));\n      var y = pos.row * this.lineHeight;\n      return {\n        pageX: canvasPos.left + x - this.scrollLeft,\n        pageY: canvasPos.top + y - this.scrollTop,\n      };\n    };\n    VirtualRenderer.prototype.visualizeFocus = function () {\n      dom.addCssClass(this.container, \"ace_focus\");\n    };\n    VirtualRenderer.prototype.visualizeBlur = function () {\n      dom.removeCssClass(this.container, \"ace_focus\");\n    };\n    VirtualRenderer.prototype.showComposition = function (composition) {\n      this.$composition = composition;\n      if (!composition.cssText) {\n        composition.cssText = this.textarea.style.cssText;\n      }\n      if (composition.useTextareaForIME == undefined)\n        composition.useTextareaForIME = this.$useTextareaForIME;\n      if (this.$useTextareaForIME) {\n        dom.addCssClass(this.textarea, \"ace_composition\");\n        this.textarea.style.cssText = \"\";\n        this.$moveTextAreaToCursor();\n        this.$cursorLayer.element.style.display = \"none\";\n      } else {\n        composition.markerId = this.session.addMarker(\n          composition.markerRange,\n          \"ace_composition_marker\",\n          \"text\",\n        );\n      }\n    };\n    VirtualRenderer.prototype.setCompositionText = function (text) {\n      var cursor = this.session.selection.cursor;\n      this.addToken(text, \"composition_placeholder\", cursor.row, cursor.column);\n      this.$moveTextAreaToCursor();\n    };\n    VirtualRenderer.prototype.hideComposition = function () {\n      if (!this.$composition) return;\n      if (this.$composition.markerId)\n        this.session.removeMarker(this.$composition.markerId);\n      dom.removeCssClass(this.textarea, \"ace_composition\");\n      this.textarea.style.cssText = this.$composition.cssText;\n      var cursor = this.session.selection.cursor;\n      this.removeExtraToken(cursor.row, cursor.column);\n      this.$composition = null;\n      this.$cursorLayer.element.style.display = \"\";\n    };\n    VirtualRenderer.prototype.setGhostText = function (text, position) {\n      var cursor = this.session.selection.cursor;\n      var insertPosition = position || {\n        row: cursor.row,\n        column: cursor.column,\n      };\n      this.removeGhostText();\n      var textLines = text.split(\"\\n\");\n      this.addToken(\n        textLines[0],\n        \"ghost_text\",\n        insertPosition.row,\n        insertPosition.column,\n      );\n      this.$ghostText = {\n        text: text,\n        position: {\n          row: insertPosition.row,\n          column: insertPosition.column,\n        },\n      };\n      if (textLines.length > 1) {\n        this.$ghostTextWidget = {\n          text: textLines.slice(1).join(\"\\n\"),\n          row: insertPosition.row,\n          column: insertPosition.column,\n          className: \"ace_ghost_text\",\n        };\n        this.session.widgetManager.addLineWidget(this.$ghostTextWidget);\n        var pixelPosition = this.$cursorLayer.getPixelPosition(\n          insertPosition,\n          true,\n        );\n        var el = this.container;\n        var height = el.getBoundingClientRect().height;\n        var ghostTextHeight = textLines.length * this.lineHeight;\n        var fitsY = ghostTextHeight < height - pixelPosition.top;\n        if (fitsY) return;\n        if (ghostTextHeight < height) {\n          this.scrollBy(0, (textLines.length - 1) * this.lineHeight);\n        } else {\n          this.scrollBy(0, pixelPosition.top);\n        }\n      }\n    };\n    VirtualRenderer.prototype.removeGhostText = function () {\n      if (!this.$ghostText) return;\n      var position = this.$ghostText.position;\n      this.removeExtraToken(position.row, position.column);\n      if (this.$ghostTextWidget) {\n        this.session.widgetManager.removeLineWidget(this.$ghostTextWidget);\n        this.$ghostTextWidget = null;\n      }\n      this.$ghostText = null;\n    };\n    VirtualRenderer.prototype.addToken = function (text, type, row, column) {\n      var session = this.session;\n      session.bgTokenizer.lines[row] = null;\n      var newToken = { type: type, value: text };\n      var tokens = session.getTokens(row);\n      if (column == null || !tokens.length) {\n        tokens.push(newToken);\n      } else {\n        var l = 0;\n        for (var i = 0; i < tokens.length; i++) {\n          var token = tokens[i];\n          l += token.value.length;\n          if (column <= l) {\n            var diff = token.value.length - (l - column);\n            var before = token.value.slice(0, diff);\n            var after = token.value.slice(diff);\n            tokens.splice(i, 1, { type: token.type, value: before }, newToken, {\n              type: token.type,\n              value: after,\n            });\n            break;\n          }\n        }\n      }\n      this.updateLines(row, row);\n    };\n    VirtualRenderer.prototype.removeExtraToken = function (row, column) {\n      this.session.bgTokenizer.lines[row] = null;\n      this.updateLines(row, row);\n    };\n    VirtualRenderer.prototype.setTheme = function (theme, cb) {\n      var _self = this;\n      this.$themeId = theme;\n      _self._dispatchEvent(\"themeChange\", { theme: theme });\n      if (!theme || typeof theme == \"string\") {\n        var moduleName = theme || this.$options.theme.initialValue;\n        config.loadModule([\"theme\", moduleName], afterLoad);\n      } else {\n        afterLoad(theme);\n      }\n      function afterLoad(module) {\n        if (_self.$themeId != theme) return cb && cb();\n        if (!module || !module.cssClass)\n          throw new Error(\n            \"couldn't load module \" + theme + \" or it didn't call define\",\n          );\n        if (module.$id) _self.$themeId = module.$id;\n        dom.importCssString(module.cssText, module.cssClass, _self.container);\n        if (_self.theme)\n          dom.removeCssClass(_self.container, _self.theme.cssClass);\n        var padding =\n          \"padding\" in module\n            ? module.padding\n            : \"padding\" in (_self.theme || {})\n              ? 4\n              : _self.$padding;\n        if (_self.$padding && padding != _self.$padding)\n          _self.setPadding(padding);\n        _self.$theme = module.cssClass;\n        _self.theme = module;\n        dom.addCssClass(_self.container, module.cssClass);\n        dom.setCssClass(_self.container, \"ace_dark\", module.isDark);\n        if (_self.$size) {\n          _self.$size.width = 0;\n          _self.$updateSizeAsync();\n        }\n        _self._dispatchEvent(\"themeLoaded\", { theme: module });\n        cb && cb();\n      }\n    };\n    VirtualRenderer.prototype.getTheme = function () {\n      return this.$themeId;\n    };\n    VirtualRenderer.prototype.setStyle = function (style, include) {\n      dom.setCssClass(this.container, style, include !== false);\n    };\n    VirtualRenderer.prototype.unsetStyle = function (style) {\n      dom.removeCssClass(this.container, style);\n    };\n    VirtualRenderer.prototype.setCursorStyle = function (style) {\n      dom.setStyle(this.scroller.style, \"cursor\", style);\n    };\n    VirtualRenderer.prototype.setMouseCursor = function (cursorStyle) {\n      dom.setStyle(this.scroller.style, \"cursor\", cursorStyle);\n    };\n    VirtualRenderer.prototype.attachToShadowRoot = function () {\n      dom.importCssString(editorCss, \"ace_editor.css\", this.container);\n    };\n    VirtualRenderer.prototype.destroy = function () {\n      this.freeze();\n      this.$fontMetrics.destroy();\n      this.$cursorLayer.destroy();\n      this.removeAllListeners();\n      this.container.textContent = \"\";\n      this.setOption(\"useResizeObserver\", false);\n    };\n    VirtualRenderer.prototype.$updateCustomScrollbar = function (val) {\n      var _self = this;\n      this.$horizScroll = this.$vScroll = null;\n      this.scrollBarV.element.remove();\n      this.scrollBarH.element.remove();\n      if (this.$scrollDecorator) {\n        delete this.$scrollDecorator;\n      }\n      if (val === true) {\n        this.scrollBarV = new VScrollBarCustom(this.container, this);\n        this.scrollBarH = new HScrollBarCustom(this.container, this);\n        this.scrollBarV.setHeight(this.$size.scrollerHeight);\n        this.scrollBarH.setWidth(this.$size.scrollerWidth);\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.setScrollLeft(e.data - _self.scrollMargin.left);\n        });\n        this.$scrollDecorator = new Decorator(this.scrollBarV, this);\n        this.$scrollDecorator.$updateDecorators();\n      } else {\n        this.scrollBarV = new VScrollBar(this.container, this);\n        this.scrollBarH = new HScrollBar(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.setScrollLeft(e.data - _self.scrollMargin.left);\n        });\n      }\n    };\n    VirtualRenderer.prototype.$addResizeObserver = function () {\n      if (!window.ResizeObserver || this.$resizeObserver) return;\n      var self = this;\n      this.$resizeTimer = lang.delayedCall(function () {\n        if (!self.destroyed) self.onResize();\n      }, 50);\n      this.$resizeObserver = new window.ResizeObserver(function (e) {\n        var w = e[0].contentRect.width;\n        var h = e[0].contentRect.height;\n        if (\n          Math.abs(self.$size.width - w) > 1 ||\n          Math.abs(self.$size.height - h) > 1\n        ) {\n          self.$resizeTimer.delay();\n        } else {\n          self.$resizeTimer.cancel();\n        }\n      });\n      this.$resizeObserver.observe(this.container);\n    };\n    return VirtualRenderer;\n  })();\n  VirtualRenderer.prototype.CHANGE_CURSOR = 1;\n  VirtualRenderer.prototype.CHANGE_MARKER = 2;\n  VirtualRenderer.prototype.CHANGE_GUTTER = 4;\n  VirtualRenderer.prototype.CHANGE_SCROLL = 8;\n  VirtualRenderer.prototype.CHANGE_LINES = 16;\n  VirtualRenderer.prototype.CHANGE_TEXT = 32;\n  VirtualRenderer.prototype.CHANGE_SIZE = 64;\n  VirtualRenderer.prototype.CHANGE_MARKER_BACK = 128;\n  VirtualRenderer.prototype.CHANGE_MARKER_FRONT = 256;\n  VirtualRenderer.prototype.CHANGE_FULL = 512;\n  VirtualRenderer.prototype.CHANGE_H_SCROLL = 1024;\n  VirtualRenderer.prototype.$changes = 0;\n  VirtualRenderer.prototype.$padding = null;\n  VirtualRenderer.prototype.$frozen = false;\n  VirtualRenderer.prototype.STEPS = 8;\n  oop.implement(VirtualRenderer.prototype, EventEmitter);\n  config.defineOptions(VirtualRenderer.prototype, \"renderer\", {\n    useResizeObserver: {\n      set: function (value) {\n        if (!value && this.$resizeObserver) {\n          this.$resizeObserver.disconnect();\n          this.$resizeTimer.cancel();\n          this.$resizeTimer = this.$resizeObserver = null;\n        } else if (value && !this.$resizeObserver) {\n          this.$addResizeObserver();\n        }\n      },\n    },\n    animatedScroll: { initialValue: false },\n    showInvisibles: {\n      set: function (value) {\n        if (this.$textLayer.setShowInvisibles(value))\n          this.$loop.schedule(this.CHANGE_TEXT);\n      },\n      initialValue: false,\n    },\n    showPrintMargin: {\n      set: function () {\n        this.$updatePrintMargin();\n      },\n      initialValue: true,\n    },\n    printMarginColumn: {\n      set: function () {\n        this.$updatePrintMargin();\n      },\n      initialValue: 80,\n    },\n    printMargin: {\n      set: function (val) {\n        if (typeof val == \"number\") this.$printMarginColumn = val;\n        this.$showPrintMargin = !!val;\n        this.$updatePrintMargin();\n      },\n      get: function () {\n        return this.$showPrintMargin && this.$printMarginColumn;\n      },\n    },\n    showGutter: {\n      set: function (show) {\n        this.$gutter.style.display = show ? \"block\" : \"none\";\n        this.$loop.schedule(this.CHANGE_FULL);\n        this.onGutterResize();\n      },\n      initialValue: true,\n    },\n    useSvgGutterIcons: {\n      set: function (value) {\n        this.$gutterLayer.$useSvgGutterIcons = value;\n      },\n      initialValue: false,\n    },\n    showFoldedAnnotations: {\n      set: function (value) {\n        this.$gutterLayer.$showFoldedAnnotations = value;\n      },\n      initialValue: false,\n    },\n    fadeFoldWidgets: {\n      set: function (show) {\n        dom.setCssClass(this.$gutter, \"ace_fade-fold-widgets\", show);\n      },\n      initialValue: false,\n    },\n    showFoldWidgets: {\n      set: function (show) {\n        this.$gutterLayer.setShowFoldWidgets(show);\n        this.$loop.schedule(this.CHANGE_GUTTER);\n      },\n      initialValue: true,\n    },\n    displayIndentGuides: {\n      set: function (show) {\n        if (this.$textLayer.setDisplayIndentGuides(show))\n          this.$loop.schedule(this.CHANGE_TEXT);\n      },\n      initialValue: true,\n    },\n    highlightIndentGuides: {\n      set: function (show) {\n        if (this.$textLayer.setHighlightIndentGuides(show) == true) {\n          this.$textLayer.$highlightIndentGuide();\n        } else {\n          this.$textLayer.$clearActiveIndentGuide(this.$textLayer.$lines.cells);\n        }\n      },\n      initialValue: true,\n    },\n    highlightGutterLine: {\n      set: function (shouldHighlight) {\n        this.$gutterLayer.setHighlightGutterLine(shouldHighlight);\n        this.$loop.schedule(this.CHANGE_GUTTER);\n      },\n      initialValue: true,\n    },\n    hScrollBarAlwaysVisible: {\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\") size = size + \"px\";\n        this.container.style.fontSize = size;\n        this.updateFontSize();\n      },\n      initialValue: 12,\n    },\n    fontFamily: {\n      set: function (name) {\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        if (!(this.$minLines < 0x1ffffffffffff)) this.$minLines = 0;\n        this.updateFull();\n      },\n    },\n    maxPixelHeight: {\n      set: function (val) {\n        this.updateFull();\n      },\n      initialValue: 0,\n    },\n    scrollPastEnd: {\n      set: function (val) {\n        val = +val || 0;\n        if (this.$scrollPastEnd == val) 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    customScrollbar: {\n      set: function (val) {\n        this.$updateCustomScrollbar(val);\n      },\n      initialValue: false,\n    },\n    theme: {\n      set: function (val) {\n        this.setTheme(val);\n      },\n      get: function () {\n        return this.$themeId || this.theme;\n      },\n      initialValue: \"./theme/textmate\",\n      handlesSet: true,\n    },\n    hasCssTransforms: {},\n    useTextareaForIME: {\n      initialValue: !useragent.isMobile && !useragent.isIE,\n    },\n  });\n  exports.VirtualRenderer = VirtualRenderer;\n});\n\ndefine(\"ace/worker/worker_client\", [\n  \"require\",\n  \"exports\",\n  \"module\",\n  \"ace/lib/oop\",\n  \"ace/lib/net\",\n  \"ace/lib/event_emitter\",\n  \"ace/config\",\n], function (require, exports, module) {\n  \"use strict\";\n\n  var oop = require(\"../lib/oop\");\n  var net = require(\"../lib/net\");\n  var EventEmitter = require(\"../lib/event_emitter\").EventEmitter;\n  var config = require(\"../config\");\n\n  function $workerBlob(workerUrl) {\n    var script = \"importScripts('\" + net.qualifyURL(workerUrl) + \"');\";\n    try {\n      return new Blob([script], { type: \"application/javascript\" });\n    } catch (e) {\n      // Backwards-compatibility\n      var BlobBuilder =\n        window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder;\n      var blobBuilder = new BlobBuilder();\n      blobBuilder.append(script);\n      return blobBuilder.getBlob(\"application/javascript\");\n    }\n  }\n\n  function createWorker(workerUrl) {\n    if (typeof Worker == \"undefined\")\n      return { postMessage: function () {}, terminate: function () {} };\n    if (config.get(\"loadWorkerFromBlob\")) {\n      var blob = $workerBlob(workerUrl);\n      var URL = window.URL || window.webkitURL;\n      var blobURL = URL.createObjectURL(blob);\n      return new Worker(blobURL);\n    }\n    return new Worker(workerUrl);\n  }\n\n  var WorkerClient = function (worker) {\n    if (!worker.postMessage)\n      worker = this.$createWorkerFromOldConfig.apply(this, arguments);\n\n    this.$worker = worker;\n    this.$sendDeltaQueue = this.$sendDeltaQueue.bind(this);\n    this.changeListener = this.changeListener.bind(this);\n    this.onMessage = this.onMessage.bind(this);\n\n    this.callbackId = 1;\n    this.callbacks = {};\n\n    this.$worker.onmessage = this.onMessage;\n  };\n\n  (function () {\n    oop.implement(this, EventEmitter);\n\n    this.$createWorkerFromOldConfig = function (\n      topLevelNamespaces,\n      mod,\n      classname,\n      workerUrl,\n      importScripts,\n    ) {\n      if (require.nameToUrl && !require.toUrl)\n        require.toUrl = require.nameToUrl;\n\n      if (config.get(\"packaged\") || !require.toUrl) {\n        workerUrl = workerUrl || config.moduleUrl(mod, \"worker\");\n      } else {\n        var normalizePath = this.$normalizePath;\n        workerUrl =\n          workerUrl ||\n          normalizePath(require.toUrl(\"ace/worker/worker.js\", null, \"_\"));\n\n        var tlns = {};\n        topLevelNamespaces.forEach(function (ns) {\n          tlns[ns] = normalizePath(\n            require.toUrl(ns, null, \"_\").replace(/(\\.js)?(\\?.*)?$/, \"\"),\n          );\n        });\n      }\n\n      this.$worker = createWorker(workerUrl);\n      if (importScripts) {\n        this.send(\"importScripts\", importScripts);\n      }\n      this.$worker.postMessage({\n        init: true,\n        tlns: tlns,\n        module: mod,\n        classname: classname,\n      });\n      return this.$worker;\n    };\n\n    this.onMessage = function (e) {\n      var msg = e.data;\n      switch (msg.type) {\n        case \"event\":\n          this._signal(msg.name, { data: msg.data });\n          break;\n        case \"call\":\n          var callback = this.callbacks[msg.id];\n          if (callback) {\n            callback(msg.data);\n            delete this.callbacks[msg.id];\n          }\n          break;\n        case \"error\":\n          this.reportError(msg.data);\n          break;\n        case \"log\":\n          window.console && console.log && console.log.apply(console, msg.data);\n          break;\n      }\n    };\n\n    this.reportError = function (err) {\n      window.console && console.error && console.error(err);\n    };\n\n    this.$normalizePath = function (path) {\n      return net.qualifyURL(path);\n    };\n\n    this.terminate = function () {\n      this._signal(\"terminate\", {});\n      this.deltaQueue = null;\n      this.$worker.terminate();\n      this.$worker.onerror = function (e) {\n        e.preventDefault();\n      };\n      this.$worker = null;\n      if (this.$doc) this.$doc.off(\"change\", this.changeListener);\n      this.$doc = null;\n    };\n\n    this.send = function (cmd, args) {\n      this.$worker.postMessage({ command: cmd, args: args });\n    };\n\n    this.call = function (cmd, args, callback) {\n      if (callback) {\n        var id = this.callbackId++;\n        this.callbacks[id] = callback;\n        args.push(id);\n      }\n      this.send(cmd, args);\n    };\n\n    this.emit = function (event, data) {\n      try {\n        if (data.data && data.data.err)\n          data.data.err = {\n            message: data.data.err.message,\n            stack: data.data.err.stack,\n            code: data.data.err.code,\n          };\n        this.$worker &&\n          this.$worker.postMessage({ event: event, data: { data: data.data } });\n      } catch (ex) {\n        console.error(ex.stack);\n      }\n    };\n\n    this.attachToDocument = function (doc) {\n      if (this.$doc) this.terminate();\n\n      this.$doc = doc;\n      this.call(\"setValue\", [doc.getValue()]);\n      doc.on(\"change\", this.changeListener, true);\n    };\n\n    this.changeListener = function (delta) {\n      if (!this.deltaQueue) {\n        this.deltaQueue = [];\n        setTimeout(this.$sendDeltaQueue, 0);\n      }\n      if (delta.action == \"insert\")\n        this.deltaQueue.push(delta.start, delta.lines);\n      else this.deltaQueue.push(delta.start, delta.end);\n    };\n\n    this.$sendDeltaQueue = function () {\n      var q = this.deltaQueue;\n      if (!q) return;\n      this.deltaQueue = null;\n      if (q.length > 50 && q.length > this.$doc.getLength() >> 1) {\n        this.call(\"setValue\", [this.$doc.getValue()]);\n      } else this.emit(\"change\", { data: q });\n    };\n  }).call(WorkerClient.prototype);\n\n  var UIWorkerClient = function (topLevelNamespaces, mod, classname) {\n    var main = null;\n    var emitSync = false;\n    var sender = Object.create(EventEmitter);\n\n    var messageBuffer = [];\n    var workerClient = new WorkerClient({\n      messageBuffer: messageBuffer,\n      terminate: function () {},\n      postMessage: function (e) {\n        messageBuffer.push(e);\n        if (!main) return;\n        if (emitSync) setTimeout(processNext);\n        else processNext();\n      },\n    });\n\n    workerClient.setEmitSync = function (val) {\n      emitSync = val;\n    };\n\n    var processNext = function () {\n      var msg = messageBuffer.shift();\n      if (msg.command) main[msg.command].apply(main, msg.args);\n      else if (msg.event) sender._signal(msg.event, msg.data);\n    };\n\n    sender.postMessage = function (msg) {\n      workerClient.onMessage({ data: msg });\n    };\n    sender.callback = function (data, callbackId) {\n      this.postMessage({ type: \"call\", id: callbackId, data: data });\n    };\n    sender.emit = function (name, data) {\n      this.postMessage({ type: \"event\", name: name, data: data });\n    };\n\n    config.loadModule([\"worker\", mod], function (Main) {\n      main = new Main[classname](sender);\n      while (messageBuffer.length) processNext();\n    });\n\n    return workerClient;\n  };\n\n  exports.UIWorkerClient = UIWorkerClient;\n  exports.WorkerClient = WorkerClient;\n  exports.createWorker = createWorker;\n});\n\ndefine(\"ace/placeholder\", [\n  \"require\",\n  \"exports\",\n  \"module\",\n  \"ace/range\",\n  \"ace/lib/event_emitter\",\n  \"ace/lib/oop\",\n], function (require, exports, module) {\n  \"use strict\";\n  var Range = require(\"./range\").Range;\n  var EventEmitter = require(\"./lib/event_emitter\").EventEmitter;\n  var oop = require(\"./lib/oop\");\n  var PlaceHolder = /** @class */ (function () {\n    function PlaceHolder(session, length, pos, others, mainClass, othersClass) {\n      var _self = this;\n      this.length = length;\n      this.session = session;\n      this.doc = session.getDocument();\n      this.mainClass = mainClass;\n      this.othersClass = othersClass;\n      this.$onUpdate = this.onUpdate.bind(this);\n      this.doc.on(\"change\", this.$onUpdate, true);\n      this.$others = others;\n      this.$onCursorChange = function () {\n        setTimeout(function () {\n          _self.onCursorChange();\n        });\n      };\n      this.$pos = pos;\n      var undoStack = session.getUndoManager().$undoStack ||\n        session.getUndoManager()[\"$undostack\"] || { length: -1 };\n      this.$undoStackDepth = undoStack.length;\n      this.setup();\n      session.selection.on(\"changeCursor\", this.$onCursorChange);\n    }\n    PlaceHolder.prototype.setup = function () {\n      var _self = this;\n      var doc = this.doc;\n      var session = this.session;\n      this.selectionBefore = session.selection.toJSON();\n      if (session.selection.inMultiSelectMode)\n        session.selection.toSingleRange();\n      this.pos = doc.createAnchor(this.$pos.row, this.$pos.column);\n      var pos = this.pos;\n      pos.$insertRight = true;\n      pos.detach();\n      pos.markerId = session.addMarker(\n        new Range(pos.row, pos.column, pos.row, pos.column + this.length),\n        this.mainClass,\n        null,\n        false,\n      );\n      this.others = [];\n      this.$others.forEach(function (other) {\n        var anchor = doc.createAnchor(other.row, other.column);\n        anchor.$insertRight = true;\n        anchor.detach();\n        _self.others.push(anchor);\n      });\n      session.setUndoSelect(false);\n    };\n    PlaceHolder.prototype.showOtherMarkers = function () {\n      if (this.othersActive) return;\n      var session = this.session;\n      var _self = this;\n      this.othersActive = true;\n      this.others.forEach(function (anchor) {\n        anchor.markerId = session.addMarker(\n          new Range(\n            anchor.row,\n            anchor.column,\n            anchor.row,\n            anchor.column + _self.length,\n          ),\n          _self.othersClass,\n          null,\n          false,\n        );\n      });\n    };\n    PlaceHolder.prototype.hideOtherMarkers = function () {\n      if (!this.othersActive) return;\n      this.othersActive = false;\n      for (var i = 0; i < this.others.length; i++) {\n        this.session.removeMarker(this.others[i].markerId);\n      }\n    };\n    PlaceHolder.prototype.onUpdate = function (delta) {\n      if (this.$updating) return this.updateAnchors(delta);\n      var range = delta;\n      if (range.start.row !== range.end.row) return;\n      if (range.start.row !== this.pos.row) return;\n      this.$updating = true;\n      var lengthDiff =\n        delta.action === \"insert\"\n          ? range.end.column - range.start.column\n          : range.start.column - range.end.column;\n      var inMainRange =\n        range.start.column >= this.pos.column &&\n        range.start.column <= this.pos.column + this.length + 1;\n      var distanceFromStart = range.start.column - this.pos.column;\n      this.updateAnchors(delta);\n      if (inMainRange) this.length += lengthDiff;\n      if (inMainRange && !this.session.$fromUndo) {\n        if (delta.action === \"insert\") {\n          for (var i = this.others.length - 1; i >= 0; i--) {\n            var otherPos = this.others[i];\n            var newPos = {\n              row: otherPos.row,\n              column: otherPos.column + distanceFromStart,\n            };\n            this.doc.insertMergedLines(newPos, delta.lines);\n          }\n        } else if (delta.action === \"remove\") {\n          for (var i = this.others.length - 1; i >= 0; i--) {\n            var otherPos = this.others[i];\n            var newPos = {\n              row: otherPos.row,\n              column: otherPos.column + distanceFromStart,\n            };\n            this.doc.remove(\n              new Range(\n                newPos.row,\n                newPos.column,\n                newPos.row,\n                newPos.column - lengthDiff,\n              ),\n            );\n          }\n        }\n      }\n      this.$updating = false;\n      this.updateMarkers();\n    };\n    PlaceHolder.prototype.updateAnchors = function (delta) {\n      this.pos.onChange(delta);\n      for (var i = this.others.length; i--; ) this.others[i].onChange(delta);\n      this.updateMarkers();\n    };\n    PlaceHolder.prototype.updateMarkers = function () {\n      if (this.$updating) return;\n      var _self = this;\n      var session = this.session;\n      var updateMarker = function (pos, className) {\n        session.removeMarker(pos.markerId);\n        pos.markerId = session.addMarker(\n          new Range(pos.row, pos.column, pos.row, pos.column + _self.length),\n          className,\n          null,\n          false,\n        );\n      };\n      updateMarker(this.pos, this.mainClass);\n      for (var i = this.others.length; i--; )\n        updateMarker(this.others[i], this.othersClass);\n    };\n    PlaceHolder.prototype.onCursorChange = function (event) {\n      if (this.$updating || !this.session) return;\n      var pos = this.session.selection.getCursor();\n      if (\n        pos.row === this.pos.row &&\n        pos.column >= this.pos.column &&\n        pos.column <= this.pos.column + this.length\n      ) {\n        this.showOtherMarkers();\n        this._emit(\"cursorEnter\", event);\n      } else {\n        this.hideOtherMarkers();\n        this._emit(\"cursorLeave\", event);\n      }\n    };\n    PlaceHolder.prototype.detach = function () {\n      this.session.removeMarker(this.pos && this.pos.markerId);\n      this.hideOtherMarkers();\n      this.doc.off(\"change\", this.$onUpdate);\n      this.session.selection.off(\"changeCursor\", this.$onCursorChange);\n      this.session.setUndoSelect(true);\n      this.session = null;\n    };\n    PlaceHolder.prototype.cancel = function () {\n      if (this.$undoStackDepth === -1) return;\n      var undoManager = this.session.getUndoManager();\n      var undosRequired =\n        (undoManager.$undoStack || undoManager[\"$undostack\"]).length -\n        this.$undoStackDepth;\n      for (var i = 0; i < undosRequired; i++) {\n        undoManager.undo(this.session, true);\n      }\n      if (this.selectionBefore)\n        this.session.selection.fromJSON(this.selectionBefore);\n    };\n    return PlaceHolder;\n  })();\n  oop.implement(PlaceHolder.prototype, EventEmitter);\n  exports.PlaceHolder = PlaceHolder;\n});\n\ndefine(\"ace/mouse/multi_select_handler\", [\n  \"require\",\n  \"exports\",\n  \"module\",\n  \"ace/lib/event\",\n  \"ace/lib/useragent\",\n], function (require, exports, module) {\n  var event = require(\"../lib/event\");\n  var useragent = require(\"../lib/useragent\");\n  function isSamePoint(p1, p2) {\n    return p1.row == p2.row && p1.column == p2.column;\n  }\n  function onMouseDown(e) {\n    var ev = e.domEvent;\n    var alt = ev.altKey;\n    var shift = ev.shiftKey;\n    var ctrl = ev.ctrlKey;\n    var accel = e.getAccelKey();\n    var button = e.getButton();\n    if (ctrl && useragent.isMac) button = ev.button;\n    if (e.editor.inMultiSelectMode && button == 2) {\n      e.editor.textInput.onContextMenu(e.domEvent);\n      return;\n    }\n    if (!ctrl && !alt && !accel) {\n      if (button === 0 && e.editor.inMultiSelectMode)\n        e.editor.exitMultiSelectMode();\n      return;\n    }\n    if (button !== 0) return;\n    var editor = e.editor;\n    var selection = editor.selection;\n    var isMultiSelect = editor.inMultiSelectMode;\n    var pos = e.getDocumentPosition();\n    var cursor = selection.getCursor();\n    var inSelection =\n      e.inSelection() || (selection.isEmpty() && isSamePoint(pos, cursor));\n    var mouseX = e.x,\n      mouseY = e.y;\n    var onMouseSelection = function (e) {\n      mouseX = e.clientX;\n      mouseY = e.clientY;\n    };\n    var session = editor.session;\n    var screenAnchor = editor.renderer.pixelToScreenCoordinates(mouseX, mouseY);\n    var screenCursor = screenAnchor;\n    var selectionMode;\n    if (editor.$mouseHandler.$enableJumpToDef) {\n      if ((ctrl && alt) || (accel && alt))\n        selectionMode = shift ? \"block\" : \"add\";\n      else if (alt && editor.$blockSelectEnabled) selectionMode = \"block\";\n    } else {\n      if (accel && !alt) {\n        selectionMode = \"add\";\n        if (!isMultiSelect && shift) return;\n      } else if (alt && editor.$blockSelectEnabled) {\n        selectionMode = \"block\";\n      }\n    }\n    if (selectionMode && useragent.isMac && ev.ctrlKey) {\n      editor.$mouseHandler.cancelContextMenu();\n    }\n    if (selectionMode == \"add\") {\n      if (!isMultiSelect && inSelection) return; // dragging\n      if (!isMultiSelect) {\n        var range = selection.toOrientedRange();\n        editor.addSelectionMarker(range);\n      }\n      var oldRange = selection.rangeList.rangeAtPoint(pos);\n      editor.inVirtualSelectionMode = true;\n      if (shift) {\n        oldRange = null;\n        range = selection.ranges[0] || range;\n        editor.removeSelectionMarker(range);\n      }\n      editor.once(\"mouseup\", function () {\n        var tmpSel = selection.toOrientedRange();\n        if (\n          oldRange &&\n          tmpSel.isEmpty() &&\n          isSamePoint(oldRange.cursor, tmpSel.cursor)\n        )\n          selection.substractPoint(tmpSel.cursor);\n        else {\n          if (shift) {\n            selection.substractPoint(range.cursor);\n          } else if (range) {\n            editor.removeSelectionMarker(range);\n            selection.addRange(range);\n          }\n          selection.addRange(tmpSel);\n        }\n        editor.inVirtualSelectionMode = false;\n      });\n    } else if (selectionMode == \"block\") {\n      e.stop();\n      editor.inVirtualSelectionMode = true;\n      var initialRange;\n      var rectSel = [];\n      var blockSelect = function () {\n        var newCursor = editor.renderer.pixelToScreenCoordinates(\n          mouseX,\n          mouseY,\n        );\n        var cursor = session.screenToDocumentPosition(\n          newCursor.row,\n          newCursor.column,\n          newCursor.offsetX,\n        );\n        if (\n          isSamePoint(screenCursor, newCursor) &&\n          isSamePoint(cursor, selection.lead)\n        )\n          return;\n        screenCursor = newCursor;\n        editor.selection.moveToPosition(cursor);\n        editor.renderer.scrollCursorIntoView();\n        editor.removeSelectionMarkers(rectSel);\n        rectSel = selection.rectangularRangeBlock(screenCursor, screenAnchor);\n        if (\n          editor.$mouseHandler.$clickSelection &&\n          rectSel.length == 1 &&\n          rectSel[0].isEmpty()\n        )\n          rectSel[0] = editor.$mouseHandler.$clickSelection.clone();\n        rectSel.forEach(editor.addSelectionMarker, editor);\n        editor.updateSelectionMarkers();\n      };\n      if (isMultiSelect && !accel) {\n        selection.toSingleRange();\n      } else if (!isMultiSelect && accel) {\n        initialRange = selection.toOrientedRange();\n        editor.addSelectionMarker(initialRange);\n      }\n      if (shift)\n        screenAnchor = session.documentToScreenPosition(selection.lead);\n      else selection.moveToPosition(pos);\n      screenCursor = { row: -1, column: -1 };\n      var onMouseSelectionEnd = function (e) {\n        blockSelect();\n        clearInterval(timerId);\n        editor.removeSelectionMarkers(rectSel);\n        if (!rectSel.length) rectSel = [selection.toOrientedRange()];\n        if (initialRange) {\n          editor.removeSelectionMarker(initialRange);\n          selection.toSingleRange(initialRange);\n        }\n        for (var i = 0; i < rectSel.length; i++) selection.addRange(rectSel[i]);\n        editor.inVirtualSelectionMode = false;\n        editor.$mouseHandler.$clickSelection = null;\n      };\n      var onSelectionInterval = blockSelect;\n      event.capture(editor.container, onMouseSelection, onMouseSelectionEnd);\n      var timerId = setInterval(function () {\n        onSelectionInterval();\n      }, 20);\n      return e.preventDefault();\n    }\n  }\n  exports.onMouseDown = onMouseDown;\n});\n\ndefine(\"ace/commands/multi_select_commands\", [\n  \"require\",\n  \"exports\",\n  \"module\",\n  \"ace/keyboard/hash_handler\",\n], function (require, exports, module) {\n  /**\n   * commands to enter multiselect mode\n   * @type {import(\"../../ace-internal\").Ace.Command[]}\n   */\n  exports.defaultCommands = [\n    {\n      name: \"addCursorAbove\",\n      description: \"Add cursor above\",\n      exec: function (editor) {\n        editor.selectMoreLines(-1);\n      },\n      bindKey: { win: \"Ctrl-Alt-Up\", mac: \"Ctrl-Alt-Up\" },\n      scrollIntoView: \"cursor\",\n      readOnly: true,\n    },\n    {\n      name: \"addCursorBelow\",\n      description: \"Add cursor below\",\n      exec: function (editor) {\n        editor.selectMoreLines(1);\n      },\n      bindKey: { win: \"Ctrl-Alt-Down\", mac: \"Ctrl-Alt-Down\" },\n      scrollIntoView: \"cursor\",\n      readOnly: true,\n    },\n    {\n      name: \"addCursorAboveSkipCurrent\",\n      description: \"Add cursor above (skip current)\",\n      exec: function (editor) {\n        editor.selectMoreLines(-1, true);\n      },\n      bindKey: { win: \"Ctrl-Alt-Shift-Up\", mac: \"Ctrl-Alt-Shift-Up\" },\n      scrollIntoView: \"cursor\",\n      readOnly: true,\n    },\n    {\n      name: \"addCursorBelowSkipCurrent\",\n      description: \"Add cursor below (skip current)\",\n      exec: function (editor) {\n        editor.selectMoreLines(1, true);\n      },\n      bindKey: { win: \"Ctrl-Alt-Shift-Down\", mac: \"Ctrl-Alt-Shift-Down\" },\n      scrollIntoView: \"cursor\",\n      readOnly: true,\n    },\n    {\n      name: \"selectMoreBefore\",\n      description: \"Select more before\",\n      exec: function (editor) {\n        editor.selectMore(-1);\n      },\n      bindKey: { win: \"Ctrl-Alt-Left\", mac: \"Ctrl-Alt-Left\" },\n      scrollIntoView: \"cursor\",\n      readOnly: true,\n    },\n    {\n      name: \"selectMoreAfter\",\n      description: \"Select more after\",\n      exec: function (editor) {\n        editor.selectMore(1);\n      },\n      bindKey: { win: \"Ctrl-Alt-Right\", mac: \"Ctrl-Alt-Right\" },\n      scrollIntoView: \"cursor\",\n      readOnly: true,\n    },\n    {\n      name: \"selectNextBefore\",\n      description: \"Select next before\",\n      exec: function (editor) {\n        editor.selectMore(-1, true);\n      },\n      bindKey: { win: \"Ctrl-Alt-Shift-Left\", mac: \"Ctrl-Alt-Shift-Left\" },\n      scrollIntoView: \"cursor\",\n      readOnly: true,\n    },\n    {\n      name: \"selectNextAfter\",\n      description: \"Select next after\",\n      exec: function (editor) {\n        editor.selectMore(1, true);\n      },\n      bindKey: { win: \"Ctrl-Alt-Shift-Right\", mac: \"Ctrl-Alt-Shift-Right\" },\n      scrollIntoView: \"cursor\",\n      readOnly: true,\n    },\n    {\n      name: \"toggleSplitSelectionIntoLines\",\n      description: \"Split selection into lines\",\n      exec: function (editor) {\n        if (editor.multiSelect.rangeCount > 1)\n          editor.multiSelect.joinSelections();\n        else editor.multiSelect.splitIntoLines();\n      },\n      bindKey: { win: \"Ctrl-Alt-L\", mac: \"Ctrl-Alt-L\" },\n      readOnly: true,\n    },\n    {\n      name: \"splitSelectionIntoLines\",\n      description: \"Split into lines\",\n      exec: function (editor) {\n        editor.multiSelect.splitIntoLines();\n      },\n      readOnly: true,\n    },\n    {\n      name: \"alignCursors\",\n      description: \"Align cursors\",\n      exec: function (editor) {\n        editor.alignCursors();\n      },\n      bindKey: { win: \"Ctrl-Alt-A\", mac: \"Ctrl-Alt-A\" },\n      scrollIntoView: \"cursor\",\n    },\n    {\n      name: \"findAll\",\n      description: \"Find all\",\n      exec: function (editor) {\n        editor.findAll();\n      },\n      bindKey: { win: \"Ctrl-Alt-K\", mac: \"Ctrl-Alt-G\" },\n      scrollIntoView: \"cursor\",\n      readOnly: true,\n    },\n  ];\n  exports.multiSelectCommands = [\n    {\n      name: \"singleSelection\",\n      description: \"Single selection\",\n      bindKey: \"esc\",\n      exec: function (editor) {\n        editor.exitMultiSelectMode();\n      },\n      scrollIntoView: \"cursor\",\n      readOnly: true,\n      isAvailable: function (editor) {\n        return editor && editor.inMultiSelectMode;\n      },\n    },\n  ];\n  var HashHandler = require(\"../keyboard/hash_handler\").HashHandler;\n  exports.keyboardHandler = new HashHandler(exports.multiSelectCommands);\n});\n\ndefine(\"ace/multi_select\", [\n  \"require\",\n  \"exports\",\n  \"module\",\n  \"ace/range_list\",\n  \"ace/range\",\n  \"ace/selection\",\n  \"ace/mouse/multi_select_handler\",\n  \"ace/lib/event\",\n  \"ace/lib/lang\",\n  \"ace/commands/multi_select_commands\",\n  \"ace/search\",\n  \"ace/edit_session\",\n  \"ace/editor\",\n  \"ace/config\",\n], function (require, exports, module) {\n  /**\n   * @typedef {import(\"./anchor\").Anchor} Anchor\n   * @typedef {import(\"../ace-internal\").Ace.Point} Point\n   * @typedef {import(\"../ace-internal\").Ace.ScreenCoordinates} ScreenCoordinates\n   */\n  var RangeList = require(\"./range_list\").RangeList;\n  var Range = require(\"./range\").Range;\n  var Selection = require(\"./selection\").Selection;\n  var onMouseDown = require(\"./mouse/multi_select_handler\").onMouseDown;\n  var event = require(\"./lib/event\");\n  var lang = require(\"./lib/lang\");\n  var commands = require(\"./commands/multi_select_commands\");\n  exports.commands = commands.defaultCommands.concat(\n    commands.multiSelectCommands,\n  );\n  var Search = require(\"./search\").Search;\n  var search = new Search();\n  function find(session, needle, dir) {\n    search.$options.wrap = true;\n    search.$options.needle = needle;\n    search.$options.backwards = dir == -1;\n    return search.find(session);\n  }\n  var EditSession = require(\"./edit_session\").EditSession;\n  (function () {\n    this.getSelectionMarkers = function () {\n      return this.$selectionMarkers;\n    };\n  }).call(EditSession.prototype);\n  (function () {\n    this.ranges = null;\n    this.rangeList = null;\n    this.addRange = function (range, $blockChangeEvents) {\n      if (!range) return;\n      if (!this.inMultiSelectMode && this.rangeCount === 0) {\n        var oldRange = this.toOrientedRange();\n        this.rangeList.add(oldRange);\n        this.rangeList.add(range);\n        if (this.rangeList.ranges.length != 2) {\n          this.rangeList.removeAll();\n          return $blockChangeEvents || this.fromOrientedRange(range);\n        }\n        this.rangeList.removeAll();\n        this.rangeList.add(oldRange);\n        this.$onAddRange(oldRange);\n      }\n      if (!range.cursor) range.cursor = range.end;\n      var removed = this.rangeList.add(range);\n      this.$onAddRange(range);\n      if (removed.length) this.$onRemoveRange(removed);\n      if (this.rangeCount > 1 && !this.inMultiSelectMode) {\n        this._signal(\"multiSelect\");\n        this.inMultiSelectMode = true;\n        this.session.$undoSelect = false;\n        this.rangeList.attach(this.session);\n      }\n      return $blockChangeEvents || this.fromOrientedRange(range);\n    };\n    this.toSingleRange = function (range) {\n      range = range || this.ranges[0];\n      var removed = this.rangeList.removeAll();\n      if (removed.length) this.$onRemoveRange(removed);\n      range && this.fromOrientedRange(range);\n    };\n    this.substractPoint = function (pos) {\n      var removed = this.rangeList.substractPoint(pos);\n      if (removed) {\n        this.$onRemoveRange(removed);\n        return removed[0];\n      }\n    };\n    this.mergeOverlappingRanges = function () {\n      var removed = this.rangeList.merge();\n      if (removed.length) this.$onRemoveRange(removed);\n    };\n    this.$onAddRange = function (range) {\n      this.rangeCount = this.rangeList.ranges.length;\n      this.ranges.unshift(range);\n      this._signal(\"addRange\", { range: range });\n    };\n    this.$onRemoveRange = function (removed) {\n      this.rangeCount = this.rangeList.ranges.length;\n      if (this.rangeCount == 1 && this.inMultiSelectMode) {\n        var lastRange = this.rangeList.ranges.pop();\n        removed.push(lastRange);\n        this.rangeCount = 0;\n      }\n      for (var i = removed.length; i--; ) {\n        var index = this.ranges.indexOf(removed[i]);\n        this.ranges.splice(index, 1);\n      }\n      this._signal(\"removeRange\", { ranges: removed });\n      if (this.rangeCount === 0 && this.inMultiSelectMode) {\n        this.inMultiSelectMode = false;\n        this._signal(\"singleSelect\");\n        this.session.$undoSelect = true;\n        this.rangeList.detach(this.session);\n      }\n      lastRange = lastRange || this.ranges[0];\n      if (lastRange && !lastRange.isEqual(this.getRange()))\n        this.fromOrientedRange(lastRange);\n    };\n    this.$initRangeList = function () {\n      if (this.rangeList) return;\n      this.rangeList = new RangeList();\n      this.ranges = [];\n      this.rangeCount = 0;\n    };\n    this.getAllRanges = function () {\n      return this.rangeCount\n        ? this.rangeList.ranges.concat()\n        : [this.getRange()];\n    };\n    this.splitIntoLines = function () {\n      var ranges = this.ranges.length ? this.ranges : [this.getRange()];\n      var newRanges = [];\n      for (var i = 0; i < ranges.length; i++) {\n        var range = ranges[i];\n        var row = range.start.row;\n        var endRow = range.end.row;\n        if (row === endRow) {\n          newRanges.push(range.clone());\n        } else {\n          newRanges.push(\n            new Range(\n              row,\n              range.start.column,\n              row,\n              this.session.getLine(row).length,\n            ),\n          );\n          while (++row < endRow) newRanges.push(this.getLineRange(row, true));\n          newRanges.push(new Range(endRow, 0, endRow, range.end.column));\n        }\n        if (i == 0 && !this.isBackwards()) newRanges = newRanges.reverse();\n      }\n      this.toSingleRange();\n      for (var i = newRanges.length; i--; ) this.addRange(newRanges[i]);\n    };\n    this.joinSelections = function () {\n      var ranges = this.rangeList.ranges;\n      var lastRange = ranges[ranges.length - 1];\n      var range = Range.fromPoints(ranges[0].start, lastRange.end);\n      this.toSingleRange();\n      this.setSelectionRange(range, lastRange.cursor == lastRange.start);\n    };\n    this.toggleBlockSelection = function () {\n      if (this.rangeCount > 1) {\n        var ranges = this.rangeList.ranges;\n        var lastRange = ranges[ranges.length - 1];\n        var range = Range.fromPoints(ranges[0].start, lastRange.end);\n        this.toSingleRange();\n        this.setSelectionRange(range, lastRange.cursor == lastRange.start);\n      } else {\n        var cursor = this.session.documentToScreenPosition(this.cursor);\n        var anchor = this.session.documentToScreenPosition(this.anchor);\n        var rectSel = this.rectangularRangeBlock(cursor, anchor);\n        rectSel.forEach(this.addRange, this);\n      }\n    };\n    this.rectangularRangeBlock = function (\n      screenCursor,\n      screenAnchor,\n      includeEmptyLines,\n    ) {\n      var rectSel = [];\n      var xBackwards = screenCursor.column < screenAnchor.column;\n      if (xBackwards) {\n        var startColumn = screenCursor.column;\n        var endColumn = screenAnchor.column;\n        var startOffsetX = screenCursor.offsetX;\n        var endOffsetX = screenAnchor.offsetX;\n      } else {\n        var startColumn = screenAnchor.column;\n        var endColumn = screenCursor.column;\n        var startOffsetX = screenAnchor.offsetX;\n        var endOffsetX = screenCursor.offsetX;\n      }\n      var yBackwards = screenCursor.row < screenAnchor.row;\n      if (yBackwards) {\n        var startRow = screenCursor.row;\n        var endRow = screenAnchor.row;\n      } else {\n        var startRow = screenAnchor.row;\n        var endRow = screenCursor.row;\n      }\n      if (startColumn < 0) startColumn = 0;\n      if (startRow < 0) startRow = 0;\n      if (startRow == endRow) includeEmptyLines = true;\n      var docEnd;\n      for (var row = startRow; row <= endRow; row++) {\n        var range = Range.fromPoints(\n          this.session.screenToDocumentPosition(row, startColumn, startOffsetX),\n          this.session.screenToDocumentPosition(row, endColumn, endOffsetX),\n        );\n        if (range.isEmpty()) {\n          if (docEnd && isSamePoint(range.end, docEnd)) break;\n          docEnd = range.end;\n        }\n        range.cursor = xBackwards ? range.start : range.end;\n        rectSel.push(range);\n      }\n      if (yBackwards) rectSel.reverse();\n      if (!includeEmptyLines) {\n        var end = rectSel.length - 1;\n        while (rectSel[end].isEmpty() && end > 0) end--;\n        if (end > 0) {\n          var start = 0;\n          while (rectSel[start].isEmpty()) start++;\n        }\n        for (var i = end; i >= start; i--) {\n          if (rectSel[i].isEmpty()) rectSel.splice(i, 1);\n        }\n      }\n      return rectSel;\n    };\n  }).call(Selection.prototype);\n  var Editor = require(\"./editor\").Editor;\n  (function () {\n    this.updateSelectionMarkers = function () {\n      this.renderer.updateCursor();\n      this.renderer.updateBackMarkers();\n    };\n    this.addSelectionMarker = function (orientedRange) {\n      if (!orientedRange.cursor) orientedRange.cursor = orientedRange.end;\n      var style = this.getSelectionStyle();\n      orientedRange.marker = this.session.addMarker(\n        orientedRange,\n        \"ace_selection\",\n        style,\n      );\n      this.session.$selectionMarkers.push(orientedRange);\n      this.session.selectionMarkerCount = this.session.$selectionMarkers.length;\n      return orientedRange;\n    };\n    this.removeSelectionMarker = function (range) {\n      if (!range.marker) return;\n      this.session.removeMarker(range.marker);\n      var index = this.session.$selectionMarkers.indexOf(range);\n      if (index != -1) this.session.$selectionMarkers.splice(index, 1);\n      this.session.selectionMarkerCount = this.session.$selectionMarkers.length;\n    };\n    this.removeSelectionMarkers = function (ranges) {\n      var markerList = this.session.$selectionMarkers;\n      for (var i = ranges.length; i--; ) {\n        var range = ranges[i];\n        if (!range.marker) continue;\n        this.session.removeMarker(range.marker);\n        var index = markerList.indexOf(range);\n        if (index != -1) markerList.splice(index, 1);\n      }\n      this.session.selectionMarkerCount = markerList.length;\n    };\n    this.$onAddRange = function (e) {\n      this.addSelectionMarker(e.range);\n      this.renderer.updateCursor();\n      this.renderer.updateBackMarkers();\n    };\n    this.$onRemoveRange = function (e) {\n      this.removeSelectionMarkers(e.ranges);\n      this.renderer.updateCursor();\n      this.renderer.updateBackMarkers();\n    };\n    this.$onMultiSelect = function (e) {\n      if (this.inMultiSelectMode) return;\n      this.inMultiSelectMode = true;\n      this.setStyle(\"ace_multiselect\");\n      this.keyBinding.addKeyboardHandler(commands.keyboardHandler);\n      this.commands.setDefaultHandler(\"exec\", this.$onMultiSelectExec);\n      this.renderer.updateCursor();\n      this.renderer.updateBackMarkers();\n    };\n    this.$onSingleSelect = function (e) {\n      if (this.session.multiSelect.inVirtualMode) return;\n      this.inMultiSelectMode = false;\n      this.unsetStyle(\"ace_multiselect\");\n      this.keyBinding.removeKeyboardHandler(commands.keyboardHandler);\n      this.commands.removeDefaultHandler(\"exec\", this.$onMultiSelectExec);\n      this.renderer.updateCursor();\n      this.renderer.updateBackMarkers();\n      this._emit(\"changeSelection\");\n    };\n    this.$onMultiSelectExec = function (e) {\n      var command = e.command;\n      var editor = e.editor;\n      if (!editor.multiSelect) return;\n      if (!command.multiSelectAction) {\n        var result = command.exec(editor, e.args || {});\n        editor.multiSelect.addRange(editor.multiSelect.toOrientedRange());\n        editor.multiSelect.mergeOverlappingRanges();\n      } else if (command.multiSelectAction == \"forEach\") {\n        result = editor.forEachSelection(command, e.args);\n      } else if (command.multiSelectAction == \"forEachLine\") {\n        result = editor.forEachSelection(command, e.args, true);\n      } else if (command.multiSelectAction == \"single\") {\n        editor.exitMultiSelectMode();\n        result = command.exec(editor, e.args || {});\n      } else {\n        result = command.multiSelectAction(editor, e.args || {});\n      }\n      return result;\n    };\n    this.forEachSelection = function (cmd, args, options) {\n      if (this.inVirtualSelectionMode) return;\n      var keepOrder = options && options.keepOrder;\n      var $byLines = options == true || (options && options.$byLines);\n      var session = this.session;\n      var selection = this.selection;\n      var rangeList = selection.rangeList;\n      var ranges = (keepOrder ? selection : rangeList).ranges;\n      var result;\n      if (!ranges.length)\n        return cmd.exec ? cmd.exec(this, args || {}) : cmd(this, args || {});\n      var reg = selection._eventRegistry;\n      selection._eventRegistry = {};\n      var tmpSel = new Selection(session);\n      this.inVirtualSelectionMode = true;\n      for (var i = ranges.length; i--; ) {\n        if ($byLines) {\n          while (i > 0 && ranges[i].start.row == ranges[i - 1].end.row) i--;\n        }\n        tmpSel.fromOrientedRange(ranges[i]);\n        tmpSel.index = i;\n        this.selection = session.selection = tmpSel;\n        var cmdResult = cmd.exec\n          ? cmd.exec(this, args || {})\n          : cmd(this, args || {});\n        if (!result && cmdResult !== undefined) result = cmdResult;\n        tmpSel.toOrientedRange(ranges[i]);\n      }\n      tmpSel.detach();\n      this.selection = session.selection = selection;\n      this.inVirtualSelectionMode = false;\n      selection._eventRegistry = reg;\n      selection.mergeOverlappingRanges();\n      if (selection.ranges[0]) selection.fromOrientedRange(selection.ranges[0]);\n      var anim = this.renderer.$scrollAnimation;\n      this.onCursorChange();\n      this.onSelectionChange();\n      if (anim && anim.from == anim.to)\n        this.renderer.animateScrolling(anim.from);\n      return result;\n    };\n    this.exitMultiSelectMode = function () {\n      if (!this.inMultiSelectMode || this.inVirtualSelectionMode) return;\n      this.multiSelect.toSingleRange();\n    };\n    this.getSelectedText = function () {\n      var text = \"\";\n      if (this.inMultiSelectMode && !this.inVirtualSelectionMode) {\n        var ranges = this.multiSelect.rangeList.ranges;\n        var buf = [];\n        for (var i = 0; i < ranges.length; i++) {\n          buf.push(this.session.getTextRange(ranges[i]));\n        }\n        var nl = this.session.getDocument().getNewLineCharacter();\n        text = buf.join(nl);\n        if (text.length == (buf.length - 1) * nl.length) text = \"\";\n      } else if (!this.selection.isEmpty()) {\n        text = this.session.getTextRange(this.getSelectionRange());\n      }\n      return text;\n    };\n    this.$checkMultiselectChange = function (e, anchor) {\n      if (this.inMultiSelectMode && !this.inVirtualSelectionMode) {\n        var range = this.multiSelect.ranges[0];\n        if (this.multiSelect.isEmpty() && anchor == this.multiSelect.anchor)\n          return;\n        var pos =\n          anchor == this.multiSelect.anchor\n            ? range.cursor == range.start\n              ? range.end\n              : range.start\n            : range.cursor;\n        if (\n          pos.row != anchor.row ||\n          this.session.$clipPositionToDocument(pos.row, pos.column).column !=\n            anchor.column\n        )\n          this.multiSelect.toSingleRange(this.multiSelect.toOrientedRange());\n        else this.multiSelect.mergeOverlappingRanges();\n      }\n    };\n    this.findAll = function (needle, options, additive) {\n      options = options || {};\n      options.needle = needle || options.needle;\n      if (options.needle == undefined) {\n        var range = this.selection.isEmpty()\n          ? this.selection.getWordRange()\n          : this.selection.getRange();\n        options.needle = this.session.getTextRange(range);\n      }\n      this.$search.set(options);\n      var ranges = this.$search.findAll(this.session);\n      if (!ranges.length) return 0;\n      var selection = this.multiSelect;\n      if (!additive) selection.toSingleRange(ranges[0]);\n      for (var i = ranges.length; i--; ) selection.addRange(ranges[i], true);\n      if (range && selection.rangeList.rangeAtPoint(range.start))\n        selection.addRange(range, true);\n      return ranges.length;\n    };\n    this.selectMoreLines = function (dir, skip) {\n      var range = this.selection.toOrientedRange();\n      var isBackwards = range.cursor == range.end;\n      var screenLead = this.session.documentToScreenPosition(range.cursor);\n      if (this.selection.$desiredColumn)\n        screenLead.column = this.selection.$desiredColumn;\n      var lead = this.session.screenToDocumentPosition(\n        screenLead.row + dir,\n        screenLead.column,\n      );\n      if (!range.isEmpty()) {\n        var screenAnchor = this.session.documentToScreenPosition(\n          isBackwards ? range.end : range.start,\n        );\n        var anchor = this.session.screenToDocumentPosition(\n          screenAnchor.row + dir,\n          screenAnchor.column,\n        );\n      } else {\n        var anchor = lead;\n      }\n      if (isBackwards) {\n        var newRange = Range.fromPoints(lead, anchor);\n        newRange.cursor = newRange.start;\n      } else {\n        var newRange = Range.fromPoints(anchor, lead);\n        newRange.cursor = newRange.end;\n      }\n      newRange.desiredColumn = screenLead.column;\n      if (!this.selection.inMultiSelectMode) {\n        this.selection.addRange(range);\n      } else {\n        if (skip) var toRemove = range.cursor;\n      }\n      this.selection.addRange(newRange);\n      if (toRemove) this.selection.substractPoint(toRemove);\n    };\n    this.transposeSelections = function (dir) {\n      var session = this.session;\n      var sel = session.multiSelect;\n      var all = sel.ranges;\n      for (var i = all.length; i--; ) {\n        var range = all[i];\n        if (range.isEmpty()) {\n          var tmp_1 = session.getWordRange(range.start.row, range.start.column);\n          range.start.row = tmp_1.start.row;\n          range.start.column = tmp_1.start.column;\n          range.end.row = tmp_1.end.row;\n          range.end.column = tmp_1.end.column;\n        }\n      }\n      sel.mergeOverlappingRanges();\n      var words = [];\n      for (var i = all.length; i--; ) {\n        var range = all[i];\n        words.unshift(session.getTextRange(range));\n      }\n      if (dir < 0) words.unshift(words.pop());\n      else words.push(words.shift());\n      for (var i = all.length; i--; ) {\n        var range = all[i];\n        var tmp = range.clone();\n        session.replace(range, words[i]);\n        range.start.row = tmp.start.row;\n        range.start.column = tmp.start.column;\n      }\n      sel.fromOrientedRange(sel.ranges[0]);\n    };\n    this.selectMore = function (dir, skip, stopAtFirst) {\n      var session = this.session;\n      var sel = session.multiSelect;\n      var range = sel.toOrientedRange();\n      if (range.isEmpty()) {\n        range = session.getWordRange(range.start.row, range.start.column);\n        range.cursor = dir == -1 ? range.start : range.end;\n        this.multiSelect.addRange(range);\n        if (stopAtFirst) return;\n      }\n      var needle = session.getTextRange(range);\n      var newRange = find(session, needle, dir);\n      if (newRange) {\n        newRange.cursor = dir == -1 ? newRange.start : newRange.end;\n        this.session.unfold(newRange);\n        this.multiSelect.addRange(newRange);\n        this.renderer.scrollCursorIntoView(null, 0.5);\n      }\n      if (skip) this.multiSelect.substractPoint(range.cursor);\n    };\n    this.alignCursors = function () {\n      var session = this.session;\n      var sel = session.multiSelect;\n      var ranges = sel.ranges;\n      var row = -1;\n      var sameRowRanges = ranges.filter(function (r) {\n        if (r.cursor.row == row) return true;\n        row = r.cursor.row;\n      });\n      if (!ranges.length || sameRowRanges.length == ranges.length - 1) {\n        var range = this.selection.getRange();\n        var fr = range.start.row,\n          lr = range.end.row;\n        var guessRange = fr == lr;\n        if (guessRange) {\n          var max = this.session.getLength();\n          var line;\n          do {\n            line = this.session.getLine(lr);\n          } while (/[=:]/.test(line) && ++lr < max);\n          do {\n            line = this.session.getLine(fr);\n          } while (/[=:]/.test(line) && --fr > 0);\n          if (fr < 0) fr = 0;\n          if (lr >= max) lr = max - 1;\n        }\n        var lines = this.session.removeFullLines(fr, lr);\n        lines = this.$reAlignText(lines, guessRange);\n        this.session.insert({ row: fr, column: 0 }, lines.join(\"\\n\") + \"\\n\");\n        if (!guessRange) {\n          range.start.column = 0;\n          range.end.column = lines[lines.length - 1].length;\n        }\n        this.selection.setRange(range);\n      } else {\n        sameRowRanges.forEach(function (r) {\n          sel.substractPoint(r.cursor);\n        });\n        var maxCol = 0;\n        var minSpace = Infinity;\n        var spaceOffsets = ranges.map(function (r) {\n          var p = r.cursor;\n          var line = session.getLine(p.row);\n          var spaceOffset = line.substr(p.column).search(/\\S/g);\n          if (spaceOffset == -1) spaceOffset = 0;\n          if (p.column > maxCol) maxCol = p.column;\n          if (spaceOffset < minSpace) minSpace = spaceOffset;\n          return spaceOffset;\n        });\n        ranges.forEach(function (r, i) {\n          var p = r.cursor;\n          var l = maxCol - p.column;\n          var d = spaceOffsets[i] - minSpace;\n          if (l > d) session.insert(p, lang.stringRepeat(\" \", l - d));\n          else\n            session.remove(new Range(p.row, p.column, p.row, p.column - l + d));\n          r.start.column = r.end.column = maxCol;\n          r.start.row = r.end.row = p.row;\n          r.cursor = r.end;\n        });\n        sel.fromOrientedRange(ranges[0]);\n        this.renderer.updateCursor();\n        this.renderer.updateBackMarkers();\n      }\n    };\n    this.$reAlignText = function (lines, forceLeft) {\n      var isLeftAligned = true,\n        isRightAligned = true;\n      var startW, textW, endW;\n      return lines\n        .map(function (line) {\n          var m = line.match(/(\\s*)(.*?)(\\s*)([=:].*)/);\n          if (!m) return [line];\n          if (startW == null) {\n            startW = m[1].length;\n            textW = m[2].length;\n            endW = m[3].length;\n            return m;\n          }\n          if (startW + textW + endW != m[1].length + m[2].length + m[3].length)\n            isRightAligned = false;\n          if (startW != m[1].length) isLeftAligned = false;\n          if (startW > m[1].length) startW = m[1].length;\n          if (textW < m[2].length) textW = m[2].length;\n          if (endW > m[3].length) endW = m[3].length;\n          return m;\n        })\n        .map(\n          forceLeft\n            ? alignLeft\n            : isLeftAligned\n              ? isRightAligned\n                ? alignRight\n                : alignLeft\n              : unAlign,\n        );\n      function spaces(n) {\n        return lang.stringRepeat(\" \", n);\n      }\n      function alignLeft(m) {\n        return !m[2]\n          ? m[0]\n          : spaces(startW) +\n              m[2] +\n              spaces(textW - m[2].length + endW) +\n              m[4].replace(/^([=:])\\s+/, \"$1 \");\n      }\n      function alignRight(m) {\n        return !m[2]\n          ? m[0]\n          : spaces(startW + textW - m[2].length) +\n              m[2] +\n              spaces(endW) +\n              m[4].replace(/^([=:])\\s+/, \"$1 \");\n      }\n      function unAlign(m) {\n        return !m[2]\n          ? m[0]\n          : spaces(startW) +\n              m[2] +\n              spaces(endW) +\n              m[4].replace(/^([=:])\\s+/, \"$1 \");\n      }\n    };\n  }).call(Editor.prototype);\n  function isSamePoint(p1, p2) {\n    return p1.row == p2.row && p1.column == p2.column;\n  }\n  exports.onSessionChange = function (e) {\n    var session = e.session;\n    if (session && !session.multiSelect) {\n      session.$selectionMarkers = [];\n      session.selection.$initRangeList();\n      session.multiSelect = session.selection;\n    }\n    this.multiSelect = session && session.multiSelect;\n    var oldSession = e.oldSession;\n    if (oldSession) {\n      oldSession.multiSelect.off(\"addRange\", this.$onAddRange);\n      oldSession.multiSelect.off(\"removeRange\", this.$onRemoveRange);\n      oldSession.multiSelect.off(\"multiSelect\", this.$onMultiSelect);\n      oldSession.multiSelect.off(\"singleSelect\", this.$onSingleSelect);\n      oldSession.multiSelect.lead.off(\"change\", this.$checkMultiselectChange);\n      oldSession.multiSelect.anchor.off(\"change\", this.$checkMultiselectChange);\n    }\n    if (session) {\n      session.multiSelect.on(\"addRange\", this.$onAddRange);\n      session.multiSelect.on(\"removeRange\", this.$onRemoveRange);\n      session.multiSelect.on(\"multiSelect\", this.$onMultiSelect);\n      session.multiSelect.on(\"singleSelect\", this.$onSingleSelect);\n      session.multiSelect.lead.on(\"change\", this.$checkMultiselectChange);\n      session.multiSelect.anchor.on(\"change\", this.$checkMultiselectChange);\n    }\n    if (\n      session &&\n      this.inMultiSelectMode != session.selection.inMultiSelectMode\n    ) {\n      if (session.selection.inMultiSelectMode) this.$onMultiSelect();\n      else this.$onSingleSelect();\n    }\n  };\n  function MultiSelect(editor) {\n    if (editor.$multiselectOnSessionChange) 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    editor.$checkMultiselectChange =\n      editor.$checkMultiselectChange.bind(editor);\n    editor.$multiselectOnSessionChange(editor);\n    editor.on(\"changeSession\", editor.$multiselectOnSessionChange);\n    editor.on(\"mousedown\", onMouseDown);\n    editor.commands.addCommands(commands.defaultCommands);\n    addAltCursorListeners(editor);\n  }\n  function addAltCursorListeners(editor) {\n    if (!editor.textInput) return;\n    var el = editor.textInput.getElement();\n    var altCursor = false;\n    event.addListener(\n      el,\n      \"keydown\",\n      function (e) {\n        var altDown =\n          e.keyCode == 18 && !(e.ctrlKey || e.shiftKey || e.metaKey);\n        if (editor.$blockSelectEnabled && altDown) {\n          if (!altCursor) {\n            editor.renderer.setMouseCursor(\"crosshair\");\n            altCursor = true;\n          }\n        } else if (altCursor) {\n          reset();\n        }\n      },\n      editor,\n    );\n    event.addListener(el, \"keyup\", reset, editor);\n    event.addListener(el, \"blur\", reset, editor);\n    function reset(e) {\n      if (altCursor) {\n        editor.renderer.setMouseCursor(\"\");\n        altCursor = false;\n      }\n    }\n  }\n  exports.MultiSelect = MultiSelect;\n  require(\"./config\").defineOptions(Editor.prototype, \"editor\", {\n    enableMultiselect: {\n      set: function (val) {\n        MultiSelect(this);\n        if (val) {\n          this.on(\"mousedown\", onMouseDown);\n        } else {\n          this.off(\"mousedown\", onMouseDown);\n        }\n      },\n      value: true,\n    },\n    enableBlockSelect: {\n      set: function (val) {\n        this.$blockSelectEnabled = val;\n      },\n      value: true,\n    },\n  });\n});\n\ndefine(\"ace/mode/folding/fold_mode\", [\n  \"require\",\n  \"exports\",\n  \"module\",\n  \"ace/range\",\n], function (require, exports, module) {\n  \"use strict\";\n  var Range = require(\"../../range\").Range;\n  var FoldMode = (exports.FoldMode = function () {});\n  (function () {\n    this.foldingStartMarker = null;\n    this.foldingStopMarker = null;\n    this.getFoldWidget = function (session, foldStyle, row) {\n      var line = session.getLine(row);\n      if (this.foldingStartMarker.test(line)) return \"start\";\n      if (\n        foldStyle == \"markbeginend\" &&\n        this.foldingStopMarker &&\n        this.foldingStopMarker.test(line)\n      )\n        return \"end\";\n      return \"\";\n    };\n    this.getFoldWidgetRange = function (session, foldStyle, row) {\n      return null;\n    };\n    this.indentationBlock = function (session, row, column) {\n      var re = /\\S/;\n      var line = session.getLine(row);\n      var startLevel = line.search(re);\n      if (startLevel == -1) return;\n      var startColumn = column || line.length;\n      var maxRow = session.getLength();\n      var startRow = row;\n      var endRow = row;\n      while (++row < maxRow) {\n        var level = session.getLine(row).search(re);\n        if (level == -1) continue;\n        if (level <= startLevel) {\n          var token = session.getTokenAt(row, 0);\n          if (!token || token.type !== \"string\") break;\n        }\n        endRow = row;\n      }\n      if (endRow > startRow) {\n        var endColumn = session.getLine(endRow).length;\n        return new Range(startRow, startColumn, endRow, endColumn);\n      }\n    };\n    this.openingBracketBlock = function (\n      session,\n      bracket,\n      row,\n      column,\n      typeRe,\n    ) {\n      var start = { row: row, column: column + 1 };\n      var end = session.$findClosingBracket(bracket, start, typeRe);\n      if (!end) return;\n      var fw = session.foldWidgets[end.row];\n      if (fw == null) fw = session.getFoldWidget(end.row);\n      if (fw == \"start\" && end.row > start.row) {\n        end.row--;\n        end.column = session.getLine(end.row).length;\n      }\n      return Range.fromPoints(start, end);\n    };\n    this.closingBracketBlock = function (\n      session,\n      bracket,\n      row,\n      column,\n      typeRe,\n    ) {\n      var end = { row: row, column: column };\n      var start = session.$findOpeningBracket(bracket, end);\n      if (!start) return;\n      start.column++;\n      end.column--;\n      return Range.fromPoints(start, end);\n    };\n  }).call(FoldMode.prototype);\n});\n\ndefine(\"ace/ext/error_marker\", [\n  \"require\",\n  \"exports\",\n  \"module\",\n  \"ace/line_widgets\",\n  \"ace/lib/dom\",\n  \"ace/range\",\n  \"ace/config\",\n], function (require, exports, module) {\n  \"use strict\";\n  var LineWidgets = require(\"../line_widgets\").LineWidgets;\n  var dom = require(\"../lib/dom\");\n  var Range = require(\"../range\").Range;\n  var nls = require(\"../config\").nls;\n  function binarySearch(array, needle, comparator) {\n    var first = 0;\n    var last = array.length - 1;\n    while (first <= last) {\n      var mid = (first + last) >> 1;\n      var c = comparator(needle, array[mid]);\n      if (c > 0) first = mid + 1;\n      else if (c < 0) last = mid - 1;\n      else return mid;\n    }\n    return -(first + 1);\n  }\n  function findAnnotations(session, row, dir) {\n    var annotations = session.getAnnotations().sort(Range.comparePoints);\n    if (!annotations.length) return;\n    var i = binarySearch(\n      annotations,\n      { row: row, column: -1 },\n      Range.comparePoints,\n    );\n    if (i < 0) i = -i - 1;\n    if (i >= annotations.length) i = dir > 0 ? 0 : annotations.length - 1;\n    else if (i === 0 && dir < 0) i = annotations.length - 1;\n    var annotation = annotations[i];\n    if (!annotation || !dir) return;\n    if (annotation.row === row) {\n      do {\n        annotation = annotations[(i += dir)];\n      } while (annotation && annotation.row === row);\n      if (!annotation) return annotations.slice();\n    }\n    var matched = [];\n    row = annotation.row;\n    do {\n      matched[dir < 0 ? \"unshift\" : \"push\"](annotation);\n      annotation = annotations[(i += dir)];\n    } while (annotation && annotation.row == row);\n    return matched.length && matched;\n  }\n  exports.showErrorMarker = function (editor, dir) {\n    var session = editor.session;\n    if (!session.widgetManager) {\n      session.widgetManager = new LineWidgets(session);\n      session.widgetManager.attach(editor);\n    }\n    var pos = editor.getCursorPosition();\n    var row = pos.row;\n    var oldWidget = session.widgetManager\n      .getWidgetsAtRow(row)\n      .filter(function (w) {\n        return w.type == \"errorMarker\";\n      })[0];\n    if (oldWidget) {\n      oldWidget.destroy();\n    } else {\n      row -= dir;\n    }\n    var annotations = findAnnotations(session, row, dir);\n    var gutterAnno;\n    if (annotations) {\n      var annotation = annotations[0];\n      pos.column =\n        (annotation.pos && typeof annotation.column != \"number\"\n          ? annotation.pos.sc\n          : annotation.column) || 0;\n      pos.row = annotation.row;\n      gutterAnno = editor.renderer.$gutterLayer.$annotations[pos.row];\n    } else if (oldWidget) {\n      return;\n    } else {\n      gutterAnno = {\n        text: [nls(\"Looks good!\")],\n        className: \"ace_ok\",\n      };\n    }\n    editor.session.unfold(pos.row);\n    editor.selection.moveToPosition(pos);\n    var w = {\n      row: pos.row,\n      fixedWidth: true,\n      coverGutter: true,\n      el: dom.createElement(\"div\"),\n      type: \"errorMarker\",\n    };\n    var el = w.el.appendChild(dom.createElement(\"div\"));\n    var arrow = w.el.appendChild(dom.createElement(\"div\"));\n    arrow.className = \"error_widget_arrow \" + gutterAnno.className;\n    var left = editor.renderer.$cursorLayer.getPixelPosition(pos).left;\n    arrow.style.left = left + editor.renderer.gutterWidth - 5 + \"px\";\n    w.el.className = \"error_widget_wrapper\";\n    el.className = \"error_widget \" + gutterAnno.className;\n    el.innerHTML = gutterAnno.text.join(\"<br>\");\n    el.appendChild(dom.createElement(\"div\"));\n    var kb = function (_, hashId, keyString) {\n      if (hashId === 0 && (keyString === \"esc\" || keyString === \"return\")) {\n        w.destroy();\n        return { command: \"null\" };\n      }\n    };\n    w.destroy = function () {\n      if (editor.$mouseHandler.isMousePressed) return;\n      editor.keyBinding.removeKeyboardHandler(kb);\n      session.widgetManager.removeLineWidget(w);\n      editor.off(\"changeSelection\", w.destroy);\n      editor.off(\"changeSession\", w.destroy);\n      editor.off(\"mouseup\", w.destroy);\n      editor.off(\"change\", w.destroy);\n    };\n    editor.keyBinding.addKeyboardHandler(kb);\n    editor.on(\"changeSelection\", w.destroy);\n    editor.on(\"changeSession\", w.destroy);\n    editor.on(\"mouseup\", w.destroy);\n    editor.on(\"change\", w.destroy);\n    editor.session.widgetManager.addLineWidget(w);\n    w.el.onmousedown = editor.focus.bind(editor);\n    editor.renderer.scrollCursorIntoView(null, 0.5, {\n      bottom: w.el.offsetHeight,\n    });\n  };\n  dom.importCssString(\n    \"\\n    .error_widget_wrapper {\\n        background: inherit;\\n        color: inherit;\\n        border:none\\n    }\\n    .error_widget {\\n        border-top: solid 2px;\\n        border-bottom: solid 2px;\\n        margin: 5px 0;\\n        padding: 10px 40px;\\n        white-space: pre-wrap;\\n    }\\n    .error_widget.ace_error, .error_widget_arrow.ace_error{\\n        border-color: #ff5a5a\\n    }\\n    .error_widget.ace_warning, .error_widget_arrow.ace_warning{\\n        border-color: #F1D817\\n    }\\n    .error_widget.ace_info, .error_widget_arrow.ace_info{\\n        border-color: #5a5a5a\\n    }\\n    .error_widget.ace_ok, .error_widget_arrow.ace_ok{\\n        border-color: #5aaa5a\\n    }\\n    .error_widget_arrow {\\n        position: absolute;\\n        border: solid 5px;\\n        border-top-color: transparent!important;\\n        border-right-color: transparent!important;\\n        border-left-color: transparent!important;\\n        top: -5px;\\n    }\\n\",\n    \"error_marker.css\",\n    false,\n  );\n});\n\ndefine(\"ace/ace\", [\n  \"require\",\n  \"exports\",\n  \"module\",\n  \"ace/lib/dom\",\n  \"ace/range\",\n  \"ace/editor\",\n  \"ace/edit_session\",\n  \"ace/undomanager\",\n  \"ace/virtual_renderer\",\n  \"ace/worker/worker_client\",\n  \"ace/keyboard/hash_handler\",\n  \"ace/placeholder\",\n  \"ace/multi_select\",\n  \"ace/mode/folding/fold_mode\",\n  \"ace/theme/textmate\",\n  \"ace/ext/error_marker\",\n  \"ace/config\",\n  \"ace/loader_build\",\n], function (require, exports, module) {\n  /**\n   * The main class required to set up an Ace instance in the browser.\n   *\n   * @namespace Ace\n   **/\n  \"use strict\";\n  require(\"./loader_build\")(exports);\n  var dom = require(\"./lib/dom\");\n  var Range = require(\"./range\").Range;\n  var Editor = require(\"./editor\").Editor;\n  var EditSession = require(\"./edit_session\").EditSession;\n  var UndoManager = require(\"./undomanager\").UndoManager;\n  var Renderer = require(\"./virtual_renderer\").VirtualRenderer;\n  require(\"./worker/worker_client\");\n  require(\"./keyboard/hash_handler\");\n  require(\"./placeholder\");\n  require(\"./multi_select\");\n  require(\"./mode/folding/fold_mode\");\n  require(\"./theme/textmate\");\n  require(\"./ext/error_marker\");\n  exports.config = require(\"./config\");\n  exports.edit = function (el, options) {\n    if (typeof el == \"string\") {\n      var _id = el;\n      el = document.getElementById(_id);\n      if (!el) throw new Error(\"ace.edit can't find div #\" + _id);\n    }\n    if (el && el.env && el.env.editor instanceof Editor) return el.env.editor;\n    var value = \"\";\n    if (el && /input|textarea/i.test(el.tagName)) {\n      var oldNode = el;\n      value = oldNode.value;\n      el = dom.createElement(\"pre\");\n      oldNode.parentNode.replaceChild(el, oldNode);\n    } else if (el) {\n      value = el.textContent;\n      el.innerHTML = \"\";\n    }\n    var doc = exports.createEditSession(value);\n    var editor = new Editor(new Renderer(el), doc, options);\n    var env = {\n      document: doc,\n      editor: editor,\n      onResize: editor.resize.bind(editor, null),\n    };\n    if (oldNode) env.textarea = oldNode;\n    editor.on(\"destroy\", function () {\n      env.editor.container.env = null; // prevent memory leak on old ie\n    });\n    editor.container.env = editor.env = env;\n    return editor;\n  };\n  exports.createEditSession = function (text, mode) {\n    var doc = new EditSession(text, mode);\n    doc.setUndoManager(new UndoManager());\n    return doc;\n  };\n  exports.Range = Range;\n  exports.Editor = Editor;\n  exports.EditSession = EditSession;\n  exports.UndoManager = UndoManager;\n  exports.VirtualRenderer = Renderer;\n  exports.version = exports.config.version;\n});\n(function () {\n  window.require([\"ace/ace\"], function (a) {\n    if (a) {\n      a.config.init(true);\n      a.define = window.define;\n    }\n    var global = (function () {\n      return this;\n    })();\n    if (!global && typeof window != \"undefined\") global = window; // can happen in strict mode\n    if (!global && typeof self != \"undefined\") global = self; // can happen in webworker\n\n    if (!global.ace) global.ace = a;\n    for (var key in a) if (a.hasOwnProperty(key)) global.ace[key] = a[key];\n    global.ace[\"default\"] = global.ace;\n    if (typeof module == \"object\" && typeof exports == \"object\" && module) {\n      module.exports = global.ace;\n    }\n  });\n})();\n", "define(\"ace/mode/jsdoc_comment_highlight_rules\", [\n  \"require\",\n  \"exports\",\n  \"module\",\n  \"ace/lib/oop\",\n  \"ace/mode/text_highlight_rules\",\n], function (require, exports, module) {\n  \"use strict\";\n  var oop = require(\"../lib/oop\");\n  var TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n  var JsDocCommentHighlightRules = function () {\n    this.$rules = {\n      start: [\n        {\n          token: [\"comment.doc.tag\", \"comment.doc.text\", \"lparen.doc\"],\n          regex:\n            \"(@(?:param|member|typedef|property|namespace|var|const|callback))(\\\\s*)({)\",\n          push: [\n            {\n              token: \"lparen.doc\",\n              regex: \"{\",\n              push: [\n                {\n                  include: \"doc-syntax\",\n                },\n                {\n                  token: \"rparen.doc\",\n                  regex: \"}|(?=$)\",\n                  next: \"pop\",\n                },\n              ],\n            },\n            {\n              token: [\n                \"rparen.doc\",\n                \"text.doc\",\n                \"variable.parameter.doc\",\n                \"lparen.doc\",\n                \"variable.parameter.doc\",\n                \"rparen.doc\",\n              ],\n              regex: /(})(\\s*)(?:([\\w=:\\/\\.]+)|(?:(\\[)([\\w=:\\/\\.]+)(\\])))/,\n              next: \"pop\",\n            },\n            {\n              token: \"rparen.doc\",\n              regex: \"}|(?=$)\",\n              next: \"pop\",\n            },\n            {\n              include: \"doc-syntax\",\n            },\n            {\n              defaultToken: \"text.doc\",\n            },\n          ],\n        },\n        {\n          token: [\"comment.doc.tag\", \"text.doc\", \"lparen.doc\"],\n          regex:\n            \"(@(?:returns?|yields|type|this|suppress|public|protected|private|package|modifies|\" +\n            \"implements|external|exception|throws|enum|define|extends))(\\\\s*)({)\",\n          push: [\n            {\n              token: \"lparen.doc\",\n              regex: \"{\",\n              push: [\n                {\n                  include: \"doc-syntax\",\n                },\n                {\n                  token: \"rparen.doc\",\n                  regex: \"}|(?=$)\",\n                  next: \"pop\",\n                },\n              ],\n            },\n            {\n              token: \"rparen.doc\",\n              regex: \"}|(?=$)\",\n              next: \"pop\",\n            },\n            {\n              include: \"doc-syntax\",\n            },\n            {\n              defaultToken: \"text.doc\",\n            },\n          ],\n        },\n        {\n          token: [\"comment.doc.tag\", \"text.doc\", \"variable.parameter.doc\"],\n          regex:\n            \"(@(?:alias|memberof|instance|module|name|lends|namespace|external|this|template|\" +\n            \"requires|param|implements|function|extends|typedef|mixes|constructor|var|\" +\n            \"memberof\\\\!|event|listens|exports|class|constructs|interface|emits|fires|\" +\n            'throws|const|callback|borrows|augments))(\\\\s+)(\\\\w[\\\\w#.:/~\"\\\\-]*)?',\n        },\n        {\n          token: [\"comment.doc.tag\", \"text.doc\", \"variable.parameter.doc\"],\n          regex: \"(@method)(\\\\s+)(\\\\w[\\\\w.\\\\(\\\\)]*)\",\n        },\n        {\n          token: \"comment.doc.tag\",\n          regex: \"@access\\\\s+(?:private|public|protected)\",\n        },\n        {\n          token: \"comment.doc.tag\",\n          regex:\n            \"@kind\\\\s+(?:class|constant|event|external|file|function|member|mixin|module|namespace|typedef)\",\n        },\n        {\n          token: \"comment.doc.tag\",\n          regex: \"@\\\\w+(?=\\\\s|$)\",\n        },\n        JsDocCommentHighlightRules.getTagRule(),\n        {\n          defaultToken: \"comment.doc\",\n          caseInsensitive: true,\n        },\n      ],\n      \"doc-syntax\": [\n        {\n          token: \"operator.doc\",\n          regex: /[|:]/,\n        },\n        {\n          token: \"paren.doc\",\n          regex: /[\\[\\]]/,\n        },\n      ],\n    };\n    this.normalizeRules();\n  };\n  oop.inherits(JsDocCommentHighlightRules, TextHighlightRules);\n  JsDocCommentHighlightRules.getTagRule = function (start) {\n    return {\n      token: \"comment.doc.tag.storage.type\",\n      regex: \"\\\\b(?:TODO|FIXME|XXX|HACK)\\\\b\",\n    };\n  };\n  JsDocCommentHighlightRules.getStartRule = function (start) {\n    return {\n      token: \"comment.doc\", // doc comment\n      regex: \"\\\\/\\\\*(?=\\\\*)\",\n      next: start,\n    };\n  };\n  JsDocCommentHighlightRules.getEndRule = function (start) {\n    return {\n      token: \"comment.doc\", // closing comment\n      regex: \"\\\\*\\\\/\",\n      next: start,\n    };\n  };\n  exports.JsDocCommentHighlightRules = JsDocCommentHighlightRules;\n});\n\ndefine(\"ace/mode/javascript_highlight_rules\", [\n  \"require\",\n  \"exports\",\n  \"module\",\n  \"ace/lib/oop\",\n  \"ace/mode/jsdoc_comment_highlight_rules\",\n  \"ace/mode/text_highlight_rules\",\n], function (require, exports, module) {\n  \"use strict\";\n  var oop = require(\"../lib/oop\");\n  var DocCommentHighlightRules =\n    require(\"./jsdoc_comment_highlight_rules\").JsDocCommentHighlightRules;\n  var TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n  var identifierRe = \"[a-zA-Z\\\\$_\\u00a1-\\uffff][a-zA-Z\\\\d\\\\$_\\u00a1-\\uffff]*\";\n  var JavaScriptHighlightRules = function (options) {\n    var keywordMapper = this.createKeywordMapper(\n      {\n        \"variable.language\":\n          \"Array|Boolean|Date|Function|Iterator|Number|Object|RegExp|String|Proxy|Symbol|\" + // 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|async|await|\" +\n          \"break|case|catch|continue|default|delete|do|else|finally|for|function|\" +\n          \"if|in|of|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|constructor\",\n        \"storage.type\": \"const|let|var|function\",\n        \"constant.language\": \"null|Infinity|NaN|undefined\",\n        \"support.function\": \"alert\",\n        \"constant.language.boolean\": \"true|false\",\n      },\n      \"identifier\",\n    );\n    var kwBeforeRe =\n      \"case|do|else|finally|in|instanceof|return|throw|try|typeof|yield|void\";\n    var escapedRe =\n      \"\\\\\\\\(?:x[0-9a-fA-F]{2}|\" + // hex\n      \"u[0-9a-fA-F]{4}|\" + // unicode\n      \"u{[0-9a-fA-F]{1,6}}|\" + // es6 unicode\n      \"[0-2][0-7]{0,2}|\" + // oct\n      \"3[0-7][0-7]?|\" + // oct\n      \"[4-7][0-7]?|\" + //oct\n      \".)\";\n    this.$rules = {\n      no_regex: [\n        DocCommentHighlightRules.getStartRule(\"doc-start\"),\n        comments(\"no_regex\"),\n        {\n          token: \"string\",\n          regex: \"'(?=.)\",\n          next: \"qstring\",\n        },\n        {\n          token: \"string\",\n          regex: '\"(?=.)',\n          next: \"qqstring\",\n        },\n        {\n          token: \"constant.numeric\", // hexadecimal, octal and binary\n          regex: /0(?:[xX][0-9a-fA-F]+|[oO][0-7]+|[bB][01]+)\\b/,\n        },\n        {\n          token: \"constant.numeric\", // decimal integers and floats\n          regex: /(?:\\d\\d*(?:\\.\\d*)?|\\.\\d+)(?:[eE][+-]?\\d+\\b)?/,\n        },\n        {\n          token: [\n            \"storage.type\",\n            \"punctuation.operator\",\n            \"support.function\",\n            \"punctuation.operator\",\n            \"entity.name.function\",\n            \"text\",\n            \"keyword.operator\",\n          ],\n          regex:\n            \"(\" +\n            identifierRe +\n            \")(\\\\.)(prototype)(\\\\.)(\" +\n            identifierRe +\n            \")(\\\\s*)(=)\",\n          next: \"function_arguments\",\n        },\n        {\n          token: [\n            \"storage.type\",\n            \"punctuation.operator\",\n            \"entity.name.function\",\n            \"text\",\n            \"keyword.operator\",\n            \"text\",\n            \"storage.type\",\n            \"text\",\n            \"paren.lparen\",\n          ],\n          regex:\n            \"(\" +\n            identifierRe +\n            \")(\\\\.)(\" +\n            identifierRe +\n            \")(\\\\s*)(=)(\\\\s*)(function\\\\*?)(\\\\s*)(\\\\()\",\n          next: \"function_arguments\",\n        },\n        {\n          token: [\n            \"entity.name.function\",\n            \"text\",\n            \"keyword.operator\",\n            \"text\",\n            \"storage.type\",\n            \"text\",\n            \"paren.lparen\",\n          ],\n          regex:\n            \"(\" + identifierRe + \")(\\\\s*)(=)(\\\\s*)(function\\\\*?)(\\\\s*)(\\\\()\",\n          next: \"function_arguments\",\n        },\n        {\n          token: [\n            \"storage.type\",\n            \"punctuation.operator\",\n            \"entity.name.function\",\n            \"text\",\n            \"keyword.operator\",\n            \"text\",\n            \"storage.type\",\n            \"text\",\n            \"entity.name.function\",\n            \"text\",\n            \"paren.lparen\",\n          ],\n          regex:\n            \"(\" +\n            identifierRe +\n            \")(\\\\.)(\" +\n            identifierRe +\n            \")(\\\\s*)(=)(\\\\s*)(function\\\\*?)(\\\\s+)(\\\\w+)(\\\\s*)(\\\\()\",\n          next: \"function_arguments\",\n        },\n        {\n          token: [\n            \"storage.type\",\n            \"text\",\n            \"entity.name.function\",\n            \"text\",\n            \"paren.lparen\",\n          ],\n          regex: \"(function\\\\*?)(\\\\s+)(\" + identifierRe + \")(\\\\s*)(\\\\()\",\n          next: \"function_arguments\",\n        },\n        {\n          token: [\n            \"entity.name.function\",\n            \"text\",\n            \"punctuation.operator\",\n            \"text\",\n            \"storage.type\",\n            \"text\",\n            \"paren.lparen\",\n          ],\n          regex:\n            \"(\" + identifierRe + \")(\\\\s*)(:)(\\\\s*)(function\\\\*?)(\\\\s*)(\\\\()\",\n          next: \"function_arguments\",\n        },\n        {\n          token: [\"text\", \"text\", \"storage.type\", \"text\", \"paren.lparen\"],\n          regex: \"(:)(\\\\s*)(function\\\\*?)(\\\\s*)(\\\\()\",\n          next: \"function_arguments\",\n        },\n        {\n          token: \"keyword\",\n          regex: \"from(?=\\\\s*('|\\\"))\",\n        },\n        {\n          token: \"keyword\",\n          regex: \"(?:\" + kwBeforeRe + \")\\\\b\",\n          next: \"start\",\n        },\n        {\n          token: \"support.constant\",\n          regex: /that\\b/,\n        },\n        {\n          token: [\n            \"storage.type\",\n            \"punctuation.operator\",\n            \"support.function.firebug\",\n          ],\n          regex:\n            /(console)(\\.)(warn|info|log|error|debug|time|trace|timeEnd|assert)\\b/,\n        },\n        {\n          token: keywordMapper,\n          regex: identifierRe,\n        },\n        {\n          token: \"punctuation.operator\",\n          regex: /[.](?![.])/,\n          next: \"property\",\n        },\n        {\n          token: \"storage.type\",\n          regex: /=>/,\n          next: \"start\",\n        },\n        {\n          token: \"keyword.operator\",\n          regex:\n            /--|\\+\\+|\\.{3}|===|==|=|!=|!==|<+=?|>+=?|!|&&|\\|\\||\\?:|[!$%&*+\\-~\\/^]=?/,\n          next: \"start\",\n        },\n        {\n          token: \"punctuation.operator\",\n          regex: /[?:,;.]/,\n          next: \"start\",\n        },\n        {\n          token: \"paren.lparen\",\n          regex: /[\\[({]/,\n          next: \"start\",\n        },\n        {\n          token: \"paren.rparen\",\n          regex: /[\\])}]/,\n        },\n        {\n          token: \"comment\",\n          regex: /^#!.*$/,\n        },\n      ],\n      property: [\n        {\n          token: \"text\",\n          regex: \"\\\\s+\",\n        },\n        {\n          token: [\n            \"storage.type\",\n            \"punctuation.operator\",\n            \"entity.name.function\",\n            \"text\",\n            \"keyword.operator\",\n            \"text\",\n            \"storage.type\",\n            \"text\",\n            \"entity.name.function\",\n            \"text\",\n            \"paren.lparen\",\n          ],\n          regex:\n            \"(\" +\n            identifierRe +\n            \")(\\\\.)(\" +\n            identifierRe +\n            \")(\\\\s*)(=)(\\\\s*)(function\\\\*?)(?:(\\\\s+)(\\\\w+))?(\\\\s*)(\\\\()\",\n          next: \"function_arguments\",\n        },\n        {\n          token: \"punctuation.operator\",\n          regex: /[.](?![.])/,\n        },\n        {\n          token: \"support.function\",\n          regex:\n            /(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|lter|le(?:ModifiedDate|Size|CreatedDate|UpdatedDate)|xed)|o(?:nt(?:size|color)|rward|rEach)|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        {\n          token: \"support.function.dom\",\n          regex:\n            /(s(?:ub(?:stringData|mit)|plitText|e(?:t(?:NamedItem|Attribute(?:Node)?)|lect))|has(?:ChildNodes|Feature)|namedItem|c(?:l(?:ick|o(?:se|neNode))|reate(?:C(?:omment|DATASection|aption)|T(?:Head|extNode|Foot)|DocumentFragment|ProcessingInstruction|E(?:ntityReference|lement)|Attribute))|tabIndex|i(?:nsert(?:Row|Before|Cell|Data)|tem)|open|delete(?:Row|C(?:ell|aption)|T(?:Head|Foot)|Data)|focus|write(?:ln)?|a(?:dd|ppend(?:Child|Data))|re(?:set|place(?:Child|Data)|move(?:NamedItem|Child|Attribute(?:Node)?)?)|get(?:NamedItem|Element(?:sBy(?:Name|TagName|ClassName)|ById)|Attribute(?:Node)?)|blur)\\b(?=\\()/,\n        },\n        {\n          token: \"support.constant\",\n          regex:\n            /(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        {\n          token: \"identifier\",\n          regex: identifierRe,\n        },\n        {\n          regex: \"\",\n          token: \"empty\",\n          next: \"no_regex\",\n        },\n      ],\n      start: [\n        DocCommentHighlightRules.getStartRule(\"doc-start\"),\n        comments(\"start\"),\n        {\n          token: \"string.regexp\",\n          regex: \"\\\\/\",\n          next: \"regex\",\n        },\n        {\n          token: \"text\",\n          regex: \"\\\\s+|^$\",\n          next: \"start\",\n        },\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        {\n          token: \"string.regexp\",\n          regex: \"/[sxngimy]*\",\n          next: \"no_regex\",\n        },\n        {\n          token: \"invalid\",\n          regex: /\\{\\d+\\b,?\\d*\\}[+*]|[+*$^?][+*]|[$^][?]|\\?{3,}/,\n        },\n        {\n          token: \"constant.language.escape\",\n          regex: /\\(\\?[:=!]|\\)|\\{\\d+\\b,?\\d*\\}|[+*]\\?|[()$^+*?.]/,\n        },\n        {\n          token: \"constant.language.delimiter\",\n          regex: /\\|/,\n        },\n        {\n          token: \"constant.language.escape\",\n          regex: /\\[\\^?/,\n          next: \"regex_character_class\",\n        },\n        {\n          token: \"empty\",\n          regex: \"$\",\n          next: \"no_regex\",\n        },\n        {\n          defaultToken: \"string.regexp\",\n        },\n      ],\n      regex_character_class: [\n        {\n          token: \"regexp.charclass.keyword.operator\",\n          regex: \"\\\\\\\\(?:u[\\\\da-fA-F]{4}|x[\\\\da-fA-F]{2}|.)\",\n        },\n        {\n          token: \"constant.language.escape\",\n          regex: \"]\",\n          next: \"regex\",\n        },\n        {\n          token: \"constant.language.escape\",\n          regex: \"-\",\n        },\n        {\n          token: \"empty\",\n          regex: \"$\",\n          next: \"no_regex\",\n        },\n        {\n          defaultToken: \"string.regexp.charachterclass\",\n        },\n      ],\n      default_parameter: [\n        {\n          token: \"string\",\n          regex: \"'(?=.)\",\n          push: [\n            {\n              token: \"string\",\n              regex: \"'|$\",\n              next: \"pop\",\n            },\n            {\n              include: \"qstring\",\n            },\n          ],\n        },\n        {\n          token: \"string\",\n          regex: '\"(?=.)',\n          push: [\n            {\n              token: \"string\",\n              regex: '\"|$',\n              next: \"pop\",\n            },\n            {\n              include: \"qqstring\",\n            },\n          ],\n        },\n        {\n          token: \"constant.language\",\n          regex: \"null|Infinity|NaN|undefined\",\n        },\n        {\n          token: \"constant.numeric\", // hexadecimal, octal and binary\n          regex: /0(?:[xX][0-9a-fA-F]+|[oO][0-7]+|[bB][01]+)\\b/,\n        },\n        {\n          token: \"constant.numeric\", // decimal integers and floats\n          regex: /(?:\\d\\d*(?:\\.\\d*)?|\\.\\d+)(?:[eE][+-]?\\d+\\b)?/,\n        },\n        {\n          token: \"punctuation.operator\",\n          regex: \",\",\n          next: \"function_arguments\",\n        },\n        {\n          token: \"text\",\n          regex: \"\\\\s+\",\n        },\n        {\n          token: \"punctuation.operator\",\n          regex: \"$\",\n        },\n        {\n          token: \"empty\",\n          regex: \"\",\n          next: \"no_regex\",\n        },\n      ],\n      function_arguments: [\n        comments(\"function_arguments\"),\n        {\n          token: \"variable.parameter\",\n          regex: identifierRe,\n        },\n        {\n          token: \"punctuation.operator\",\n          regex: \",\",\n        },\n        {\n          token: \"text\",\n          regex: \"\\\\s+\",\n        },\n        {\n          token: \"punctuation.operator\",\n          regex: \"$\",\n        },\n        {\n          token: \"empty\",\n          regex: \"\",\n          next: \"no_regex\",\n        },\n      ],\n      qqstring: [\n        {\n          token: \"constant.language.escape\",\n          regex: escapedRe,\n        },\n        {\n          token: \"string\",\n          regex: \"\\\\\\\\$\",\n          consumeLineEnd: true,\n        },\n        {\n          token: \"string\",\n          regex: '\"|$',\n          next: \"no_regex\",\n        },\n        {\n          defaultToken: \"string\",\n        },\n      ],\n      qstring: [\n        {\n          token: \"constant.language.escape\",\n          regex: escapedRe,\n        },\n        {\n          token: \"string\",\n          regex: \"\\\\\\\\$\",\n          consumeLineEnd: true,\n        },\n        {\n          token: \"string\",\n          regex: \"'|$\",\n          next: \"no_regex\",\n        },\n        {\n          defaultToken: \"string\",\n        },\n      ],\n    };\n    if (!options || !options.noES6) {\n      this.$rules.no_regex.unshift(\n        {\n          regex: \"[{}]\",\n          onMatch: function (val, state, stack) {\n            this.next = val == \"{\" ? this.nextState : \"\";\n            if (val == \"{\" && stack.length) {\n              stack.unshift(\"start\", state);\n            } else if (val == \"}\" && stack.length) {\n              stack.shift();\n              this.next = stack.shift();\n              if (\n                this.next.indexOf(\"string\") != -1 ||\n                this.next.indexOf(\"jsx\") != -1\n              ) {\n                return \"paren.quasi.end\";\n              }\n            }\n            return val == \"{\" ? \"paren.lparen\" : \"paren.rparen\";\n          },\n          nextState: \"start\",\n        },\n        {\n          token: \"string.quasi.start\",\n          regex: /`/,\n          push: [\n            {\n              token: \"constant.language.escape\",\n              regex: escapedRe,\n            },\n            {\n              token: \"paren.quasi.start\",\n              regex: /\\${/,\n              push: \"start\",\n            },\n            {\n              token: \"string.quasi.end\",\n              regex: /`/,\n              next: \"pop\",\n            },\n            {\n              defaultToken: \"string.quasi\",\n            },\n          ],\n        },\n        {\n          token: [\"variable.parameter\", \"text\"],\n          regex: \"(\" + identifierRe + \")(\\\\s*)(?=\\\\=>)\",\n        },\n        {\n          token: \"paren.lparen\",\n          regex: \"(\\\\()(?=.+\\\\s*=>)\",\n          next: \"function_arguments\",\n        },\n        {\n          token: \"variable.language\",\n          regex: \"(?:(?:(?:Weak)?(?:Set|Map))|Promise)\\\\b\",\n        },\n      );\n      this.$rules[\"function_arguments\"].unshift(\n        {\n          token: \"keyword.operator\",\n          regex: \"=\",\n          next: \"default_parameter\",\n        },\n        {\n          token: \"keyword.operator\",\n          regex: \"\\\\.{3}\",\n        },\n      );\n      this.$rules[\"property\"].unshift(\n        {\n          token: \"support.function\",\n          regex:\n            \"(findIndex|repeat|startsWith|endsWith|includes|isSafeInteger|trunc|cbrt|log2|log10|sign|then|catch|\" +\n            \"finally|resolve|reject|race|any|all|allSettled|keys|entries|isInteger)\\\\b(?=\\\\()\",\n        },\n        {\n          token: \"constant.language\",\n          regex: \"(?:MAX_SAFE_INTEGER|MIN_SAFE_INTEGER|EPSILON)\\\\b\",\n        },\n      );\n      if (!options || options.jsx != false) {\n        JSX.call(this);\n      }\n    }\n    this.embedRules(DocCommentHighlightRules, \"doc-\", [\n      DocCommentHighlightRules.getEndRule(\"no_regex\"),\n    ]);\n    this.normalizeRules();\n  };\n  oop.inherits(JavaScriptHighlightRules, TextHighlightRules);\n  function JSX() {\n    var tagRegex = identifierRe.replace(\"\\\\d\", \"\\\\d\\\\-\");\n    var jsxTag = {\n      onMatch: function (val, state, stack) {\n        var offset = val.charAt(1) == \"/\" ? 2 : 1;\n        if (offset == 1) {\n          if (state != this.nextState) {\n            stack.unshift(this.next, this.nextState, 0);\n          } else {\n            stack.unshift(this.next);\n          }\n          stack[2]++;\n        } else if (offset == 2) {\n          if (state == this.nextState) {\n            stack[1]--;\n            if (!stack[1] || stack[1] < 0) {\n              stack.shift();\n              stack.shift();\n            }\n          }\n        }\n        return [\n          {\n            type:\n              \"meta.tag.punctuation.\" +\n              (offset == 1 ? \"\" : \"end-\") +\n              \"tag-open.xml\",\n            value: val.slice(0, offset),\n          },\n          {\n            type: \"meta.tag.tag-name.xml\",\n            value: val.substr(offset),\n          },\n        ];\n      },\n      regex: \"</?\" + tagRegex + \"\",\n      next: \"jsxAttributes\",\n      nextState: \"jsx\",\n    };\n    this.$rules.start.unshift(jsxTag);\n    var jsxJsRule = {\n      regex: \"{\",\n      token: \"paren.quasi.start\",\n      push: \"start\",\n    };\n    this.$rules.jsx = [\n      jsxJsRule,\n      jsxTag,\n      { include: \"reference\" },\n      { defaultToken: \"string\" },\n    ];\n    this.$rules.jsxAttributes = [\n      {\n        token: \"meta.tag.punctuation.tag-close.xml\",\n        regex: \"/?>\",\n        onMatch: function (value, currentState, stack) {\n          if (currentState == stack[0]) {\n            stack.shift();\n          }\n          if (value.length == 2) {\n            if (stack[0] == this.nextState) {\n              stack[1]--;\n            }\n            if (!stack[1] || stack[1] < 0) {\n              stack.splice(0, 2);\n            }\n          }\n          this.next = stack[0] || \"start\";\n          return [{ type: this.token, value: value }];\n        },\n        nextState: \"jsx\",\n      },\n      jsxJsRule,\n      comments(\"jsxAttributes\"),\n      {\n        token: \"entity.other.attribute-name.xml\",\n        regex: tagRegex,\n      },\n      {\n        token: \"keyword.operator.attribute-equals.xml\",\n        regex: \"=\",\n      },\n      {\n        token: \"text.tag-whitespace.xml\",\n        regex: \"\\\\s+\",\n      },\n      {\n        token: \"string.attribute-value.xml\",\n        regex: \"'\",\n        stateName: \"jsx_attr_q\",\n        push: [\n          { token: \"string.attribute-value.xml\", regex: \"'\", next: \"pop\" },\n          { include: \"reference\" },\n          { defaultToken: \"string.attribute-value.xml\" },\n        ],\n      },\n      {\n        token: \"string.attribute-value.xml\",\n        regex: '\"',\n        stateName: \"jsx_attr_qq\",\n        push: [\n          { token: \"string.attribute-value.xml\", regex: '\"', next: \"pop\" },\n          { include: \"reference\" },\n          { defaultToken: \"string.attribute-value.xml\" },\n        ],\n      },\n      jsxTag,\n    ];\n    this.$rules.reference = [\n      {\n        token: \"constant.language.escape.reference.xml\",\n        regex: \"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\",\n      },\n    ];\n  }\n  function comments(next) {\n    return [\n      {\n        token: \"comment\", // multi line comment\n        regex: /\\/\\*/,\n        next: [\n          DocCommentHighlightRules.getTagRule(),\n          { token: \"comment\", regex: \"\\\\*\\\\/\", next: next || \"pop\" },\n          { defaultToken: \"comment\", caseInsensitive: true },\n        ],\n      },\n      {\n        token: \"comment\",\n        regex: \"\\\\/\\\\/\",\n        next: [\n          DocCommentHighlightRules.getTagRule(),\n          { token: \"comment\", regex: \"$|^\", next: next || \"pop\" },\n          { defaultToken: \"comment\", caseInsensitive: true },\n        ],\n      },\n    ];\n  }\n  exports.JavaScriptHighlightRules = JavaScriptHighlightRules;\n});\n\ndefine(\"ace/mode/matching_brace_outdent\", [\n  \"require\",\n  \"exports\",\n  \"module\",\n  \"ace/range\",\n], function (require, exports, module) {\n  \"use strict\";\n  var Range = require(\"../range\").Range;\n  var MatchingBraceOutdent = function () {};\n  (function () {\n    this.checkOutdent = function (line, input) {\n      if (!/^\\s+$/.test(line)) {\n        return false;\n      }\n      return /^\\s*\\}/.test(input);\n    };\n    this.autoOutdent = function (doc, row) {\n      var line = doc.getLine(row);\n      var match = line.match(/^(\\s*\\})/);\n      if (!match) {\n        return 0;\n      }\n      var column = match[1].length;\n      var openBracePos = doc.findMatchingBracket({ row: row, column: column });\n      if (!openBracePos || openBracePos.row == row) {\n        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    this.$getIndent = function (line) {\n      return line.match(/^\\s*/)[0];\n    };\n  }).call(MatchingBraceOutdent.prototype);\n  exports.MatchingBraceOutdent = MatchingBraceOutdent;\n});\n\ndefine(\"ace/mode/folding/cstyle\", [\n  \"require\",\n  \"exports\",\n  \"module\",\n  \"ace/lib/oop\",\n  \"ace/range\",\n  \"ace/mode/folding/fold_mode\",\n], function (require, exports, module) {\n  \"use strict\";\n  var oop = require(\"../../lib/oop\");\n  var Range = require(\"../../range\").Range;\n  var BaseFoldMode = require(\"./fold_mode\").FoldMode;\n  var FoldMode = (exports.FoldMode = function (commentRegex) {\n    if (commentRegex) {\n      this.foldingStartMarker = new RegExp(\n        this.foldingStartMarker.source.replace(\n          /\\|[^|]*?$/,\n          \"|\" + commentRegex.start,\n        ),\n      );\n      this.foldingStopMarker = new RegExp(\n        this.foldingStopMarker.source.replace(\n          /\\|[^|]*?$/,\n          \"|\" + commentRegex.end,\n        ),\n      );\n    }\n  });\n  oop.inherits(FoldMode, BaseFoldMode);\n  (function () {\n    this.foldingStartMarker = /([\\{\\[\\(])[^\\}\\]\\)]*$|^\\s*(\\/\\*)/;\n    this.foldingStopMarker = /^[^\\[\\{\\(]*([\\}\\]\\)])|^[\\s\\*]*(\\*\\/)/;\n    this.singleLineBlockCommentRe = /^\\s*(\\/\\*).*\\*\\/\\s*$/;\n    this.tripleStarBlockCommentRe = /^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/;\n    this.startRegionRe = /^\\s*(\\/\\*|\\/\\/)#?region\\b/;\n    this._getFoldWidgetBase = this.getFoldWidget;\n    this.getFoldWidget = function (session, foldStyle, row) {\n      var line = session.getLine(row);\n      if (this.singleLineBlockCommentRe.test(line)) {\n        if (\n          !this.startRegionRe.test(line) &&\n          !this.tripleStarBlockCommentRe.test(line)\n        ) {\n          return \"\";\n        }\n      }\n      var fw = this._getFoldWidgetBase(session, foldStyle, row);\n      if (!fw && this.startRegionRe.test(line)) {\n        return \"start\";\n      } // lineCommentRegionStart\n      return fw;\n    };\n    this.getFoldWidgetRange = function (\n      session,\n      foldStyle,\n      row,\n      forceMultiline,\n    ) {\n      var line = session.getLine(row);\n      if (this.startRegionRe.test(line)) {\n        return this.getCommentRegionBlock(session, line, row);\n      }\n      var match = line.match(this.foldingStartMarker);\n      if (match) {\n        var i = match.index;\n        if (match[1]) {\n          return this.openingBracketBlock(session, match[1], row, i);\n        }\n        var range = session.getCommentFoldRange(row, i + match[0].length, 1);\n        if (range && !range.isMultiLine()) {\n          if (forceMultiline) {\n            range = this.getSectionRange(session, row);\n          } else if (foldStyle != \"all\") {\n            range = null;\n          }\n        }\n        return range;\n      }\n      if (foldStyle === \"markbegin\") {\n        return;\n      }\n      var match = line.match(this.foldingStopMarker);\n      if (match) {\n        var i = match.index + match[0].length;\n        if (match[1]) {\n          return this.closingBracketBlock(session, match[1], row, i);\n        }\n        return session.getCommentFoldRange(row, i, -1);\n      }\n    };\n    this.getSectionRange = function (session, row) {\n      var line = session.getLine(row);\n      var startIndent = line.search(/\\S/);\n      var startRow = row;\n      var startColumn = line.length;\n      row = row + 1;\n      var endRow = row;\n      var maxRow = session.getLength();\n      while (++row < maxRow) {\n        line = session.getLine(row);\n        var indent = line.search(/\\S/);\n        if (indent === -1) {\n          continue;\n        }\n        if (startIndent > indent) {\n          break;\n        }\n        var subRange = this.getFoldWidgetRange(session, \"all\", row);\n        if (subRange) {\n          if (subRange.start.row <= startRow) {\n            break;\n          } else if (subRange.isMultiLine()) {\n            row = subRange.end.row;\n          } else if (startIndent == indent) {\n            break;\n          }\n        }\n        endRow = row;\n      }\n      return new Range(\n        startRow,\n        startColumn,\n        endRow,\n        session.getLine(endRow).length,\n      );\n    };\n    this.getCommentRegionBlock = function (session, line, row) {\n      var startColumn = line.search(/\\s*$/);\n      var maxRow = session.getLength();\n      var startRow = row;\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        }\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        return new Range(startRow, startColumn, endRow, line.length);\n      }\n    };\n  }).call(FoldMode.prototype);\n});\n\ndefine(\"ace/mode/javascript\", [\n  \"require\",\n  \"exports\",\n  \"module\",\n  \"ace/lib/oop\",\n  \"ace/mode/text\",\n  \"ace/mode/javascript_highlight_rules\",\n  \"ace/mode/matching_brace_outdent\",\n  \"ace/worker/worker_client\",\n  \"ace/mode/behaviour/cstyle\",\n  \"ace/mode/folding/cstyle\",\n], function (require, exports, module) {\n  \"use strict\";\n  var oop = require(\"../lib/oop\");\n  var TextMode = require(\"./text\").Mode;\n  var JavaScriptHighlightRules =\n    require(\"./javascript_highlight_rules\").JavaScriptHighlightRules;\n  var MatchingBraceOutdent =\n    require(\"./matching_brace_outdent\").MatchingBraceOutdent;\n  var WorkerClient = require(\"../worker/worker_client\").WorkerClient;\n  var CstyleBehaviour = require(\"./behaviour/cstyle\").CstyleBehaviour;\n  var CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n  var Mode = function () {\n    this.HighlightRules = JavaScriptHighlightRules;\n    this.$outdent = new MatchingBraceOutdent();\n    this.$behaviour = new CstyleBehaviour();\n    this.foldingRules = new CStyleFoldMode();\n  };\n  oop.inherits(Mode, TextMode);\n  (function () {\n    this.lineCommentStart = \"//\";\n    this.blockComment = { start: \"/*\", end: \"*/\" };\n    this.$quotes = { '\"': '\"', \"'\": \"'\", \"`\": \"`\" };\n    this.$pairQuotesAfter = {\n      \"`\": /\\w/,\n    };\n    this.getNextLineIndent = function (state, line, tab) {\n      var indent = this.$getIndent(line);\n      var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n      var tokens = tokenizedLine.tokens;\n      var endState = tokenizedLine.state;\n      if (tokens.length && tokens[tokens.length - 1].type == \"comment\") {\n        return indent;\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      return indent;\n    };\n    this.checkOutdent = function (state, line, input) {\n      return this.$outdent.checkOutdent(line, input);\n    };\n    this.autoOutdent = function (state, doc, row) {\n      this.$outdent.autoOutdent(doc, row);\n    };\n    this.createWorker = function (session) {\n      var worker = new WorkerClient(\n        [\"ace\"],\n        \"ace/mode/javascript_worker\",\n        \"JavaScriptWorker\",\n      );\n      worker.attachToDocument(session.getDocument());\n      worker.on(\"annotate\", function (results) {\n        session.setAnnotations(results.data);\n      });\n      worker.on(\"terminate\", function () {\n        session.clearAnnotations();\n      });\n      return worker;\n    };\n    this.$id = \"ace/mode/javascript\";\n    this.snippetFileId = \"ace/snippets/javascript\";\n  }).call(Mode.prototype);\n  exports.Mode = Mode;\n});\n(function () {\n  window.require([\"ace/mode/javascript\"], function (m) {\n    if (typeof module == \"object\" && typeof exports == \"object\" && module) {\n      module.exports = m;\n    }\n  });\n})();\n", "define(\"ace/mode/xml_highlight_rules\", [\n  \"require\",\n  \"exports\",\n  \"module\",\n  \"ace/lib/oop\",\n  \"ace/mode/text_highlight_rules\",\n], function (require, exports, module) {\n  \"use strict\";\n  var oop = require(\"../lib/oop\");\n  var TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n  var XmlHighlightRules = function (normalize) {\n    var tagRegex = \"[_:a-zA-Z\\xc0-\\uffff][-_:.a-zA-Z0-9\\xc0-\\uffff]*\";\n    this.$rules = {\n      start: [\n        { token: \"string.cdata.xml\", regex: \"<\\\\!\\\\[CDATA\\\\[\", next: \"cdata\" },\n        {\n          token: [\"punctuation.instruction.xml\", \"keyword.instruction.xml\"],\n          regex: \"(<\\\\?)(\" + tagRegex + \")\",\n          next: \"processing_instruction\",\n        },\n        { token: \"comment.start.xml\", regex: \"<\\\\!--\", next: \"comment\" },\n        {\n          token: [\"xml-pe.doctype.xml\", \"xml-pe.doctype.xml\"],\n          regex: \"(<\\\\!)(DOCTYPE)(?=[\\\\s])\",\n          next: \"doctype\",\n          caseInsensitive: true,\n        },\n        { include: \"tag\" },\n        { token: \"text.end-tag-open.xml\", regex: \"</\" },\n        { token: \"text.tag-open.xml\", regex: \"<\" },\n        { include: \"reference\" },\n        { defaultToken: \"text.xml\" },\n      ],\n      processing_instruction: [\n        {\n          token: \"entity.other.attribute-name.decl-attribute-name.xml\",\n          regex: tagRegex,\n        },\n        {\n          token: \"keyword.operator.decl-attribute-equals.xml\",\n          regex: \"=\",\n        },\n        {\n          include: \"whitespace\",\n        },\n        {\n          include: \"string\",\n        },\n        {\n          token: \"punctuation.xml-decl.xml\",\n          regex: \"\\\\?>\",\n          next: \"start\",\n        },\n      ],\n      doctype: [\n        { include: \"whitespace\" },\n        { include: \"string\" },\n        { token: \"xml-pe.doctype.xml\", regex: \">\", next: \"start\" },\n        { token: \"xml-pe.xml\", regex: \"[-_a-zA-Z0-9:]+\" },\n        { token: \"punctuation.int-subset\", regex: \"\\\\[\", push: \"int_subset\" },\n      ],\n      int_subset: [\n        {\n          token: \"text.xml\",\n          regex: \"\\\\s+\",\n        },\n        {\n          token: \"punctuation.int-subset.xml\",\n          regex: \"]\",\n          next: \"pop\",\n        },\n        {\n          token: [\"punctuation.markup-decl.xml\", \"keyword.markup-decl.xml\"],\n          regex: \"(<\\\\!)(\" + tagRegex + \")\",\n          push: [\n            {\n              token: \"text\",\n              regex: \"\\\\s+\",\n            },\n            {\n              token: \"punctuation.markup-decl.xml\",\n              regex: \">\",\n              next: \"pop\",\n            },\n            { include: \"string\" },\n          ],\n        },\n      ],\n      cdata: [\n        { token: \"string.cdata.xml\", regex: \"\\\\]\\\\]>\", next: \"start\" },\n        { token: \"text.xml\", regex: \"\\\\s+\" },\n        { token: \"text.xml\", regex: \"(?:[^\\\\]]|\\\\](?!\\\\]>))+\" },\n      ],\n      comment: [\n        { token: \"comment.end.xml\", regex: \"-->\", next: \"start\" },\n        { defaultToken: \"comment.xml\" },\n      ],\n      reference: [\n        {\n          token: \"constant.language.escape.reference.xml\",\n          regex: \"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\",\n        },\n      ],\n      attr_reference: [\n        {\n          token: \"constant.language.escape.reference.attribute-value.xml\",\n          regex: \"(?:&#[0-9]+;)|(?:&#x[0-9a-fA-F]+;)|(?:&[a-zA-Z0-9_:\\\\.-]+;)\",\n        },\n      ],\n      tag: [\n        {\n          token: [\n            \"meta.tag.punctuation.tag-open.xml\",\n            \"meta.tag.punctuation.end-tag-open.xml\",\n            \"meta.tag.tag-name.xml\",\n          ],\n          regex: \"(?:(<)|(</))((?:\" + tagRegex + \":)?\" + tagRegex + \")\",\n          next: [\n            { include: \"attributes\" },\n            {\n              token: \"meta.tag.punctuation.tag-close.xml\",\n              regex: \"/?>\",\n              next: \"start\",\n            },\n          ],\n        },\n      ],\n      tag_whitespace: [{ token: \"text.tag-whitespace.xml\", regex: \"\\\\s+\" }],\n      whitespace: [{ token: \"text.whitespace.xml\", regex: \"\\\\s+\" }],\n      string: [\n        {\n          token: \"string.xml\",\n          regex: \"'\",\n          push: [\n            { token: \"string.xml\", regex: \"'\", next: \"pop\" },\n            { defaultToken: \"string.xml\" },\n          ],\n        },\n        {\n          token: \"string.xml\",\n          regex: '\"',\n          push: [\n            { token: \"string.xml\", regex: '\"', next: \"pop\" },\n            { defaultToken: \"string.xml\" },\n          ],\n        },\n      ],\n      attributes: [\n        {\n          token: \"entity.other.attribute-name.xml\",\n          regex: tagRegex,\n        },\n        {\n          token: \"keyword.operator.attribute-equals.xml\",\n          regex: \"=\",\n        },\n        {\n          include: \"tag_whitespace\",\n        },\n        {\n          include: \"attribute_value\",\n        },\n      ],\n      attribute_value: [\n        {\n          token: \"string.attribute-value.xml\",\n          regex: \"'\",\n          push: [\n            { token: \"string.attribute-value.xml\", regex: \"'\", next: \"pop\" },\n            { include: \"attr_reference\" },\n            { defaultToken: \"string.attribute-value.xml\" },\n          ],\n        },\n        {\n          token: \"string.attribute-value.xml\",\n          regex: '\"',\n          push: [\n            { token: \"string.attribute-value.xml\", regex: '\"', next: \"pop\" },\n            { include: \"attr_reference\" },\n            { defaultToken: \"string.attribute-value.xml\" },\n          ],\n        },\n      ],\n    };\n    if (this.constructor === XmlHighlightRules) {\n      this.normalizeRules();\n    }\n  };\n  (function () {\n    this.embedTagRules = function (HighlightRules, prefix, tag) {\n      this.$rules.tag.unshift({\n        token: [\n          \"meta.tag.punctuation.tag-open.xml\",\n          \"meta.tag.\" + tag + \".tag-name.xml\",\n        ],\n        regex: \"(<)(\" + tag + \"(?=\\\\s|>|$))\",\n        next: [\n          { include: \"attributes\" },\n          {\n            token: \"meta.tag.punctuation.tag-close.xml\",\n            regex: \"/?>\",\n            next: prefix + \"start\",\n          },\n        ],\n      });\n      this.$rules[tag + \"-end\"] = [\n        { include: \"attributes\" },\n        {\n          token: \"meta.tag.punctuation.tag-close.xml\",\n          regex: \"/?>\",\n          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        {\n          token: [\n            \"meta.tag.punctuation.end-tag-open.xml\",\n            \"meta.tag.\" + tag + \".tag-name.xml\",\n          ],\n          regex: \"(</)(\" + tag + \"(?=\\\\s|>|$))\",\n          next: tag + \"-end\",\n        },\n        {\n          token: \"string.cdata.xml\",\n          regex: \"<\\\\!\\\\[CDATA\\\\[\",\n        },\n        {\n          token: \"string.cdata.xml\",\n          regex: \"\\\\]\\\\]>\",\n        },\n      ]);\n    };\n  }).call(TextHighlightRules.prototype);\n  oop.inherits(XmlHighlightRules, TextHighlightRules);\n  exports.XmlHighlightRules = XmlHighlightRules;\n});\n\ndefine(\"ace/mode/behaviour/xml\", [\n  \"require\",\n  \"exports\",\n  \"module\",\n  \"ace/lib/oop\",\n  \"ace/mode/behaviour\",\n  \"ace/token_iterator\",\n  \"ace/lib/lang\",\n], function (require, exports, module) {\n  \"use strict\";\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  function is(token, type) {\n    return token && token.type.lastIndexOf(type + \".xml\") > -1;\n  }\n  var XmlBehaviour = function () {\n    this.add(\n      \"string_dquotes\",\n      \"insertion\",\n      function (state, action, editor, session, text) {\n        if (text == '\"' || text == \"'\") {\n          var quote = text;\n          var selected = session.doc.getTextRange(editor.getSelectionRange());\n          if (\n            selected !== \"\" &&\n            selected !== \"'\" &&\n            selected != '\"' &&\n            editor.getWrapBehavioursEnabled()\n          ) {\n            return {\n              text: quote + selected + quote,\n              selection: false,\n            };\n          }\n          var cursor = editor.getCursorPosition();\n          var line = session.doc.getLine(cursor.row);\n          var rightChar = line.substring(cursor.column, cursor.column + 1);\n          var iterator = new TokenIterator(session, cursor.row, cursor.column);\n          var token = iterator.getCurrentToken();\n          if (\n            rightChar == quote &&\n            (is(token, \"attribute-value\") || is(token, \"string\"))\n          ) {\n            return {\n              text: \"\",\n              selection: [1, 1],\n            };\n          }\n          if (!token) {\n            token = iterator.stepBackward();\n          }\n          if (!token) {\n            return;\n          }\n          while (is(token, \"tag-whitespace\") || is(token, \"whitespace\")) {\n            token = iterator.stepBackward();\n          }\n          var rightSpace = !rightChar || rightChar.match(/\\s/);\n          if (\n            (is(token, \"attribute-equals\") &&\n              (rightSpace || rightChar == \">\")) ||\n            (is(token, \"decl-attribute-equals\") &&\n              (rightSpace || rightChar == \"?\"))\n          ) {\n            return {\n              text: quote + quote,\n              selection: [1, 1],\n            };\n          }\n        }\n      },\n    );\n    this.add(\n      \"string_dquotes\",\n      \"deletion\",\n      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(\n            range.start.column + 1,\n            range.start.column + 2,\n          );\n          if (rightChar == selected) {\n            range.end.column++;\n            return range;\n          }\n        }\n      },\n    );\n    this.add(\n      \"autoclosing\",\n      \"insertion\",\n      function (state, action, editor, session, text) {\n        if (text == \">\") {\n          var position = editor.getSelectionRange().start;\n          var iterator = new TokenIterator(\n            session,\n            position.row,\n            position.column,\n          );\n          var token = iterator.getCurrentToken() || iterator.stepBackward();\n          if (\n            !token ||\n            !(\n              is(token, \"tag-name\") ||\n              is(token, \"tag-whitespace\") ||\n              is(token, \"attribute-name\") ||\n              is(token, \"attribute-equals\") ||\n              is(token, \"attribute-value\")\n            )\n          ) {\n            return;\n          }\n          if (is(token, \"reference.attribute-value\")) {\n            return;\n          }\n          if (is(token, \"attribute-value\")) {\n            var tokenEndColumn =\n              iterator.getCurrentTokenColumn() + token.value.length;\n            if (position.column < tokenEndColumn) {\n              return;\n            }\n            if (position.column == tokenEndColumn) {\n              var nextToken = iterator.stepForward();\n              if (nextToken && is(nextToken, \"attribute-value\")) {\n                return;\n              }\n              iterator.stepBackward();\n            }\n          }\n          if (\n            /^\\s*>/.test(session.getLine(position.row).slice(position.column))\n          ) {\n            return;\n          }\n          while (!is(token, \"tag-name\")) {\n            token = iterator.stepBackward();\n            if (token.value == \"<\") {\n              token = iterator.stepForward();\n              break;\n            }\n          }\n          var tokenRow = iterator.getCurrentTokenRow();\n          var tokenColumn = iterator.getCurrentTokenColumn();\n          if (is(iterator.stepBackward(), \"end-tag-open\")) {\n            return;\n          }\n          var element = token.value;\n          if (tokenRow == position.row) {\n            element = element.substring(0, position.column - tokenColumn);\n          }\n          if (this.voidElements.hasOwnProperty(element.toLowerCase())) {\n            return;\n          }\n          return {\n            text: \">\" + \"</\" + element + \">\",\n            selection: [1, 1],\n          };\n        }\n      },\n    );\n    this.add(\n      \"autoindent\",\n      \"insertion\",\n      function (state, action, editor, session, text) {\n        if (text == \"\\n\") {\n          var cursor = editor.getCursorPosition();\n          var line = session.getLine(cursor.row);\n          var iterator = new TokenIterator(session, cursor.row, cursor.column);\n          var token = iterator.getCurrentToken();\n          if (token && token.type.indexOf(\"tag-close\") !== -1) {\n            if (token.value == \"/>\") {\n              return;\n            }\n            while (token && token.type.indexOf(\"tag-name\") === -1) {\n              token = iterator.stepBackward();\n            }\n            if (!token) {\n              return;\n            }\n            var tag = token.value;\n            var row = iterator.getCurrentTokenRow();\n            token = iterator.stepBackward();\n            if (!token || token.type.indexOf(\"end-tag\") !== -1) {\n              return;\n            }\n            if (this.voidElements && !this.voidElements[tag]) {\n              var nextToken = session.getTokenAt(cursor.row, cursor.column + 1);\n              var line = session.getLine(row);\n              var nextIndent = this.$getIndent(line);\n              var indent = nextIndent + session.getTabString();\n              if (nextToken && nextToken.value === \"</\") {\n                return {\n                  text: \"\\n\" + indent + \"\\n\" + nextIndent,\n                  selection: [1, indent.length, 1, indent.length],\n                };\n              } else {\n                return {\n                  text: \"\\n\" + indent,\n                };\n              }\n            }\n          }\n        }\n      },\n    );\n  };\n  oop.inherits(XmlBehaviour, Behaviour);\n  exports.XmlBehaviour = XmlBehaviour;\n});\n\ndefine(\"ace/mode/folding/xml\", [\n  \"require\",\n  \"exports\",\n  \"module\",\n  \"ace/lib/oop\",\n  \"ace/range\",\n  \"ace/mode/folding/fold_mode\",\n], function (require, exports, module) {\n  \"use strict\";\n  var oop = require(\"../../lib/oop\");\n  var Range = require(\"../../range\").Range;\n  var BaseFoldMode = require(\"./fold_mode\").FoldMode;\n  var FoldMode = (exports.FoldMode = function (voidElements, optionalEndTags) {\n    BaseFoldMode.call(this);\n    this.voidElements = voidElements || {};\n    this.optionalEndTags = oop.mixin({}, this.voidElements);\n    if (optionalEndTags) {\n      oop.mixin(this.optionalEndTags, optionalEndTags);\n    }\n  });\n  oop.inherits(FoldMode, BaseFoldMode);\n  var Tag = function () {\n    this.tagName = \"\";\n    this.closing = false;\n    this.selfClosing = false;\n    this.start = { row: 0, column: 0 };\n    this.end = { row: 0, column: 0 };\n  };\n  function is(token, type) {\n    return token.type.lastIndexOf(type + \".xml\") > -1;\n  }\n  (function () {\n    this.getFoldWidget = function (session, foldStyle, row) {\n      var tag = this._getFirstTagInLine(session, row);\n      if (!tag) {\n        return this.getCommentFoldWidget(session, row);\n      }\n      if (tag.closing || (!tag.tagName && tag.selfClosing)) {\n        return foldStyle === \"markbeginend\" ? \"end\" : \"\";\n      }\n      if (\n        !tag.tagName ||\n        tag.selfClosing ||\n        this.voidElements.hasOwnProperty(tag.tagName.toLowerCase())\n      ) {\n        return \"\";\n      }\n      if (this._findEndTagInLine(session, row, tag.tagName, tag.end.column)) {\n        return \"\";\n      }\n      return \"start\";\n    };\n    this.getCommentFoldWidget = function (session, row) {\n      if (\n        /comment/.test(session.getState(row)) &&\n        /<!-/.test(session.getLine(row))\n      ) {\n        return \"start\";\n      }\n      return \"\";\n    };\n    this._getFirstTagInLine = function (session, row) {\n      var tokens = session.getTokens(row);\n      var tag = new Tag();\n      for (var i = 0; i < tokens.length; i++) {\n        var token = tokens[i];\n        if (is(token, \"tag-open\")) {\n          tag.end.column = tag.start.column + token.value.length;\n          tag.closing = is(token, \"end-tag-open\");\n          token = tokens[++i];\n          if (!token) {\n            return null;\n          }\n          tag.tagName = token.value;\n          tag.end.column += token.value.length;\n          for (i++; i < tokens.length; i++) {\n            token = tokens[i];\n            tag.end.column += token.value.length;\n            if (is(token, \"tag-close\")) {\n              tag.selfClosing = token.value == \"/>\";\n              break;\n            }\n          }\n          return tag;\n        } else if (is(token, \"tag-close\")) {\n          tag.selfClosing = token.value == \"/>\";\n          return tag;\n        }\n        tag.start.column += token.value.length;\n      }\n      return null;\n    };\n    this._findEndTagInLine = function (session, row, tagName, startColumn) {\n      var tokens = session.getTokens(row);\n      var column = 0;\n      for (var i = 0; i < tokens.length; i++) {\n        var token = tokens[i];\n        column += token.value.length;\n        if (column < startColumn) {\n          continue;\n        }\n        if (is(token, \"end-tag-open\")) {\n          token = tokens[i + 1];\n          if (token && token.value == tagName) {\n            return true;\n          }\n        }\n      }\n      return false;\n    };\n    this.getFoldWidgetRange = function (session, foldStyle, row) {\n      var tags = session.getMatchingTags({ row: row, column: 0 });\n      if (tags) {\n        return new Range(\n          tags.openTag.end.row,\n          tags.openTag.end.column,\n          tags.closeTag.start.row,\n          tags.closeTag.start.column,\n        );\n      } else {\n        return (\n          this.getCommentFoldWidget(session, row) &&\n          session.getCommentFoldRange(row, session.getLine(row).length)\n        );\n      }\n    };\n  }).call(FoldMode.prototype);\n});\n\ndefine(\"ace/mode/xml\", [\n  \"require\",\n  \"exports\",\n  \"module\",\n  \"ace/lib/oop\",\n  \"ace/lib/lang\",\n  \"ace/mode/text\",\n  \"ace/mode/xml_highlight_rules\",\n  \"ace/mode/behaviour/xml\",\n  \"ace/mode/folding/xml\",\n  \"ace/worker/worker_client\",\n], function (require, exports, module) {\n  \"use strict\";\n  var oop = require(\"../lib/oop\");\n  var lang = require(\"../lib/lang\");\n  var TextMode = require(\"./text\").Mode;\n  var XmlHighlightRules = require(\"./xml_highlight_rules\").XmlHighlightRules;\n  var XmlBehaviour = require(\"./behaviour/xml\").XmlBehaviour;\n  var XmlFoldMode = require(\"./folding/xml\").FoldMode;\n  var WorkerClient = require(\"../worker/worker_client\").WorkerClient;\n  var Mode = function () {\n    this.HighlightRules = XmlHighlightRules;\n    this.$behaviour = new XmlBehaviour();\n    this.foldingRules = new XmlFoldMode();\n  };\n  oop.inherits(Mode, TextMode);\n  (function () {\n    this.voidElements = lang.arrayToMap([]);\n    this.blockComment = { start: \"<!--\", end: \"-->\" };\n    this.createWorker = function (session) {\n      var worker = new WorkerClient([\"ace\"], \"ace/mode/xml_worker\", \"Worker\");\n      worker.attachToDocument(session.getDocument());\n      worker.on(\"error\", function (e) {\n        session.setAnnotations(e.data);\n      });\n      worker.on(\"terminate\", function () {\n        session.clearAnnotations();\n      });\n      return worker;\n    };\n    this.$id = \"ace/mode/xml\";\n  }).call(Mode.prototype);\n  exports.Mode = Mode;\n});\n(function () {\n  window.require([\"ace/mode/xml\"], function (m) {\n    if (typeof module == \"object\" && typeof exports == \"object\" && module) {\n      module.exports = m;\n    }\n  });\n})();\n", "define(\"ace/mode/qweb_highlight_rules\", [\"require\", \"exports\", \"module\", \"ace/lib/oop\", \"ace/mode/xml_highlight_rules\"], function (require, exports, module) {\n    \"use strict\";\n\n    var oop = require(\"../lib/oop\");\n    var XmlHighlightRules = require(\"./xml_highlight_rules\").XmlHighlightRules;\n\n    var QWebHighlightRules = function () {\n        XmlHighlightRules.call(this);\n        const xmlRules = this.$rules;\n\n        const tagRegex = xmlRules.attributes[0].regex;\n\n        this.$rules = Object.assign({},\n            xmlRules,\n            {\n                attributes: [{\n                    include: \"attributes_odoo\",\n                }, {\n                    include: \"attributes_qweb\",\n                }, {\n                    include: \"attributes_groups\",\n                }, {\n                    include: \"attributes_sample\",\n                }],\n\n                attributes_odoo: [{\n                    token: [\"entity.other.attribute-name.xml.odoo\", \"keyword.operator.attribute-equals.xml\", \"text\", \"string.attribute-value.xml.start\", \"string.attribute-value.xml.code\", \"string.attribute-value.xml.end\"],\n                    regex: '(domain|attrs|options)(=)(\\\\s*)(\")([^\"]*)(\")',\n                }, {\n                    token: [\"entity.other.attribute-name.xml.odoo\", \"keyword.operator.attribute-equals.xml\", \"text\", \"string.attribute-value.xml.start\", \"string.attribute-value.xml.code\", \"string.attribute-value.xml.end\"],\n                    regex: \"(domain|attrs|options)(=)(\\\\s*)(')([^']*)(')\",\n                }],\n\n                attributes_qweb: [{\n                    token: [\"entity.other.attribute-name.xml.qweb\", \"keyword.operator.attribute-equals.xml\", \"text\", \"string.attribute-value.xml.start\", \"string.attribute-value.xml\", \"string.attribute-value.xml.end\"],\n                    regex: '(t-name|t-call-assets|t-js|t-css)(=)(\\\\s*)(\")([^\"]*)(\")',\n                }, {\n                    token: [\"entity.other.attribute-name.xml.qweb\", \"keyword.operator.attribute-equals.xml\", \"text\", \"string.attribute-value.xml.start\", \"string.attribute-value.xml\", \"string.attribute-value.xml.end\"],\n                    regex: \"(t-name|t-call-assets|t-js|t-css)(=)(\\\\s*)(')([^']*)(')\",\n                }, {\n                    token: [\"entity.other.attribute-name.xml.qweb\", \"keyword.operator.attribute-equals.xml\", \"text\", \"string.attribute-value.xml.start\", \"string.attribute-value.xml\", \"string.attribute-value.xml\", \"string.attribute-value.xml.code\", \"string.attribute-value.xml\", \"string.attribute-value.xml\", \"string.attribute-value.xml.end\"],\n                    regex: '(t-call|t-attf-(?:' + tagRegex + '))(=)(\\\\s*)(\")([^\"#{]*)(?:([#{]\\\\{)([^\"}]+)(\\\\}[}]?))?([^\"]*)(\")',\n                }, {\n                    token: [\"entity.other.attribute-name.xml.qweb\", \"keyword.operator.attribute-equals.xml\", \"text\", \"string.attribute-value.xml.start\", \"string.attribute-value.xml\", \"string.attribute-value.xml\", \"string.attribute-value.xml.code\", \"string.attribute-value.xml\", \"string.attribute-value.xml\", \"string.attribute-value.xml.end\"],\n                    regex: \"(t-call|t-attf-(?:\" + tagRegex + \"))(=)(\\\\s*)(')([^'#{]*)(?:([#{]\\\\{)([^'}]+)(\\\\}[}]?))?([^']*)(')\",\n                }, {\n                    token: [\"entity.other.attribute-name.xml.qweb\", \"keyword.operator.attribute-equals.xml\", \"text\", \"string.attribute-value.xml.start\", \"string.attribute-value.xml.code\", \"string.attribute-value.xml.end\"],\n                    regex: '(t-(?:' + tagRegex + '))(=)(\\\\s*)(\")([^\"]*)(\")',\n                }, {\n                    token: [\"entity.other.attribute-name.xml.qweb\", \"keyword.operator.attribute-equals.xml\", \"text\", \"string.attribute-value.xml.start\", \"string.attribute-value.xml.code\", \"string.attribute-value.xml.end\"],\n                    regex: \"(t-(?:\" + tagRegex + \"))(=)(\\\\s*)(')([^']*)(')\",\n                }],\n\n                attributes_groups: [{\n                    token: [\"entity.other.attribute-name.xml.qweb\", \"keyword.operator.attribute-equals.xml\", \"text\", \"string.attribute-value.xml.start\", \"string.attribute-value.xml\", \"string.attribute-value.xml.end\"],\n                    regex: '(groups)(=)(\\\\s*)(\")([\\\\s\\\\na-zA-Z0-9.,_-]*)(\")',\n                }, {\n                    token: [\"entity.other.attribute-name.xml.qweb\", \"keyword.operator.attribute-equals.xml\", \"text\", \"string.attribute-value.xml.start\", \"string.attribute-value.xml\", \"string.attribute-value.xml.end\"],\n                    regex: \"(groups)(=)(\\\\s*)(')((?:[\\\\s\\\\na-zA-Z0-9.,_-]*)*)(')\",\n                }],\n\n                attributes_sample: [{\n                    token: \"entity.other.attribute-name.xml\",\n                    regex: tagRegex,\n                }, {\n                    token: \"keyword.operator.attribute-equals.xml\",\n                    regex: \"=\",\n                }, {\n                    include: \"tag_whitespace\",\n                }, {\n                    include: \"attribute_value\",\n                }],\n\n                tag: [{\n                    token: [\"meta.tag.punctuation.tag-open.xml\", \"meta.tag.punctuation.end-tag-open.xml\", \"meta.tag.tag-name.xml\"],\n                    regex: \"(?:(<)|(</))((?:\" + tagRegex + \":)?\" + tagRegex + \")\",\n                    next: [{\n                            include: \"attributes\",\n                        }, {\n                            token: [\"meta.tag.punctuation.end-tag-close.xml\", \"meta.tag.punctuation.tag-close.xml\"],\n                            regex: \"(/>)|(>)\",\n                            next: \"start\",\n                        },\n                    ],\n                }],\n            },\n        );\n\n        if (this.constructor === QWebHighlightRules) {\n            this.normalizeRules();\n        }\n    };\n\n    oop.inherits(QWebHighlightRules, XmlHighlightRules);\n\n    exports.QWebHighlightRules = QWebHighlightRules;\n});\n\ndefine(\"ace/mode/qweb\",[\"require\",\"exports\",\"module\",\"ace/lib/oop\",\"ace/lib/lang\",\"ace/mode/text\",\"ace/mode/qweb_highlight_rules\",\"ace/mode/behaviour/xml\",\"ace/mode/folding/xml\",\"ace/worker/worker_client\"], function(require, exports, module) {\n    \"use strict\";\n\n    var oop = require(\"../lib/oop\");\n    var lang = require(\"../lib/lang\");\n    var TextMode = require(\"./text\").Mode;\n    var QWebHighlightRules = require(\"./qweb_highlight_rules\").QWebHighlightRules;\n    var XmlBehaviour = require(\"./behaviour/xml\").XmlBehaviour;\n    var XmlFoldMode = require(\"./folding/xml\").FoldMode;\n    var WorkerClient = require(\"../worker/worker_client\").WorkerClient;\n\n    var Mode = function() {\n       this.HighlightRules = QWebHighlightRules;\n       this.$behaviour = new XmlBehaviour();\n       this.foldingRules = new XmlFoldMode();\n    };\n\n    oop.inherits(Mode, TextMode);\n\n    (function() {\n\n        this.voidElements = lang.arrayToMap([]);\n\n        this.blockComment = {start: \"<!--\", end: \"-->\"};\n\n        this.createWorker = function(session) {\n            var worker = new WorkerClient([\"ace\"], \"ace/mode/xml_worker\", \"Worker\");\n            worker.attachToDocument(session.getDocument());\n\n            worker.on(\"error\", 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        this.$id = \"ace/mode/xml\";\n    }).call(Mode.prototype);\n\n    exports.Mode = Mode;\n});\n", "define(\"ace/mode/python_highlight_rules\", [\n  \"require\",\n  \"exports\",\n  \"module\",\n  \"ace/lib/oop\",\n  \"ace/mode/text_highlight_rules\",\n], function (require, exports, module) {\n  /*\n   * TODO: python delimiters\n   */\n  \"use strict\";\n  var oop = require(\"../lib/oop\");\n  var TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n  var PythonHighlightRules = function () {\n    var keywords =\n      \"and|as|assert|break|class|continue|def|del|elif|else|except|exec|\" +\n      \"finally|for|from|global|if|import|in|is|lambda|not|or|pass|print|\" +\n      \"raise|return|try|while|with|yield|async|await|nonlocal\";\n    var builtinConstants = \"True|False|None|NotImplemented|Ellipsis|__debug__\";\n    var builtinFunctions =\n      \"abs|divmod|input|open|staticmethod|all|enumerate|int|ord|str|any|\" +\n      \"eval|isinstance|pow|sum|basestring|execfile|issubclass|print|super|\" +\n      \"binfile|bin|iter|property|tuple|bool|filter|len|range|type|bytearray|\" +\n      \"float|list|raw_input|unichr|callable|format|locals|reduce|unicode|\" +\n      \"chr|frozenset|long|reload|vars|classmethod|getattr|map|repr|xrange|\" +\n      \"cmp|globals|max|reversed|zip|compile|hasattr|memoryview|round|\" +\n      \"__import__|complex|hash|min|apply|delattr|help|next|setattr|set|\" +\n      \"buffer|dict|hex|object|slice|coerce|dir|id|oct|sorted|intern|\" +\n      \"ascii|breakpoint|bytes\";\n    var keywordMapper = this.createKeywordMapper(\n      {\n        \"invalid.deprecated\": \"debugger\",\n        \"support.function\": builtinFunctions,\n        \"variable.language\": \"self|cls\",\n        \"constant.language\": builtinConstants,\n        keyword: keywords,\n      },\n      \"identifier\",\n    );\n    var strPre = \"[uU]?\";\n    var strRawPre = \"[rR]\";\n    var strFormatPre = \"[fF]\";\n    var strRawFormatPre = \"(?:[rR][fF]|[fF][rR])\";\n    var decimalInteger = \"(?:(?:[1-9]\\\\d*)|(?:0))\";\n    var octInteger = \"(?:0[oO]?[0-7]+)\";\n    var hexInteger = \"(?:0[xX][\\\\dA-Fa-f]+)\";\n    var binInteger = \"(?:0[bB][01]+)\";\n    var integer =\n      \"(?:\" +\n      decimalInteger +\n      \"|\" +\n      octInteger +\n      \"|\" +\n      hexInteger +\n      \"|\" +\n      binInteger +\n      \")\";\n    var exponent = \"(?:[eE][+-]?\\\\d+)\";\n    var fraction = \"(?:\\\\.\\\\d+)\";\n    var intPart = \"(?:\\\\d+)\";\n    var pointFloat =\n      \"(?:(?:\" + intPart + \"?\" + fraction + \")|(?:\" + intPart + \"\\\\.))\";\n    var exponentFloat =\n      \"(?:(?:\" + pointFloat + \"|\" + intPart + \")\" + exponent + \")\";\n    var floatNumber = \"(?:\" + exponentFloat + \"|\" + pointFloat + \")\";\n    var stringEscape =\n      \"\\\\\\\\(x[0-9A-Fa-f]{2}|[0-7]{3}|[\\\\\\\\abfnrtv'\\\"]|U[0-9A-Fa-f]{8}|u[0-9A-Fa-f]{4})\";\n    this.$rules = {\n      start: [\n        {\n          token: \"comment\",\n          regex: \"#.*$\",\n        },\n        {\n          token: \"string\", // multi line \"\"\" string start\n          regex: strPre + '\"{3}',\n          next: \"qqstring3\",\n        },\n        {\n          token: \"string\", // \" string\n          regex: strPre + '\"(?=.)',\n          next: \"qqstring\",\n        },\n        {\n          token: \"string\", // multi line ''' string start\n          regex: strPre + \"'{3}\",\n          next: \"qstring3\",\n        },\n        {\n          token: \"string\", // ' string\n          regex: strPre + \"'(?=.)\",\n          next: \"qstring\",\n        },\n        {\n          token: \"string\",\n          regex: strRawPre + '\"{3}',\n          next: \"rawqqstring3\",\n        },\n        {\n          token: \"string\",\n          regex: strRawPre + '\"(?=.)',\n          next: \"rawqqstring\",\n        },\n        {\n          token: \"string\",\n          regex: strRawPre + \"'{3}\",\n          next: \"rawqstring3\",\n        },\n        {\n          token: \"string\",\n          regex: strRawPre + \"'(?=.)\",\n          next: \"rawqstring\",\n        },\n        {\n          token: \"string\",\n          regex: strFormatPre + '\"{3}',\n          next: \"fqqstring3\",\n        },\n        {\n          token: \"string\",\n          regex: strFormatPre + '\"(?=.)',\n          next: \"fqqstring\",\n        },\n        {\n          token: \"string\",\n          regex: strFormatPre + \"'{3}\",\n          next: \"fqstring3\",\n        },\n        {\n          token: \"string\",\n          regex: strFormatPre + \"'(?=.)\",\n          next: \"fqstring\",\n        },\n        {\n          token: \"string\",\n          regex: strRawFormatPre + '\"{3}',\n          next: \"rfqqstring3\",\n        },\n        {\n          token: \"string\",\n          regex: strRawFormatPre + '\"(?=.)',\n          next: \"rfqqstring\",\n        },\n        {\n          token: \"string\",\n          regex: strRawFormatPre + \"'{3}\",\n          next: \"rfqstring3\",\n        },\n        {\n          token: \"string\",\n          regex: strRawFormatPre + \"'(?=.)\",\n          next: \"rfqstring\",\n        },\n        {\n          token: \"keyword.operator\",\n          regex:\n            \"\\\\+|\\\\-|\\\\*|\\\\*\\\\*|\\\\/|\\\\/\\\\/|%|@|<<|>>|&|\\\\||\\\\^|~|<|>|<=|=>|==|!=|<>|=\",\n        },\n        {\n          token: \"punctuation\",\n          regex:\n            \",|:|;|\\\\->|\\\\+=|\\\\-=|\\\\*=|\\\\/=|\\\\/\\\\/=|%=|@=|&=|\\\\|=|^=|>>=|<<=|\\\\*\\\\*=\",\n        },\n        {\n          token: \"paren.lparen\",\n          regex: \"[\\\\[\\\\(\\\\{]\",\n        },\n        {\n          token: \"paren.rparen\",\n          regex: \"[\\\\]\\\\)\\\\}]\",\n        },\n        {\n          token: [\"keyword\", \"text\", \"entity.name.function\"],\n          regex: \"(def|class)(\\\\s+)([\\\\u00BF-\\\\u1FFF\\\\u2C00-\\\\uD7FF\\\\w]+)\",\n        },\n        {\n          token: \"text\",\n          regex: \"\\\\s+\",\n        },\n        {\n          include: \"constants\",\n        },\n      ],\n      qqstring3: [\n        {\n          token: \"constant.language.escape\",\n          regex: stringEscape,\n        },\n        {\n          token: \"string\", // multi line \"\"\" string end\n          regex: '\"{3}',\n          next: \"start\",\n        },\n        {\n          defaultToken: \"string\",\n        },\n      ],\n      qstring3: [\n        {\n          token: \"constant.language.escape\",\n          regex: stringEscape,\n        },\n        {\n          token: \"string\", // multi line ''' string end\n          regex: \"'{3}\",\n          next: \"start\",\n        },\n        {\n          defaultToken: \"string\",\n        },\n      ],\n      qqstring: [\n        {\n          token: \"constant.language.escape\",\n          regex: stringEscape,\n        },\n        {\n          token: \"string\",\n          regex: \"\\\\\\\\$\",\n          next: \"qqstring\",\n        },\n        {\n          token: \"string\",\n          regex: '\"|$',\n          next: \"start\",\n        },\n        {\n          defaultToken: \"string\",\n        },\n      ],\n      qstring: [\n        {\n          token: \"constant.language.escape\",\n          regex: stringEscape,\n        },\n        {\n          token: \"string\",\n          regex: \"\\\\\\\\$\",\n          next: \"qstring\",\n        },\n        {\n          token: \"string\",\n          regex: \"'|$\",\n          next: \"start\",\n        },\n        {\n          defaultToken: \"string\",\n        },\n      ],\n      rawqqstring3: [\n        {\n          token: \"string\", // multi line \"\"\" string end\n          regex: '\"{3}',\n          next: \"start\",\n        },\n        {\n          defaultToken: \"string\",\n        },\n      ],\n      rawqstring3: [\n        {\n          token: \"string\", // multi line ''' string end\n          regex: \"'{3}\",\n          next: \"start\",\n        },\n        {\n          defaultToken: \"string\",\n        },\n      ],\n      rawqqstring: [\n        {\n          token: \"string\",\n          regex: \"\\\\\\\\$\",\n          next: \"rawqqstring\",\n        },\n        {\n          token: \"string\",\n          regex: '\"|$',\n          next: \"start\",\n        },\n        {\n          defaultToken: \"string\",\n        },\n      ],\n      rawqstring: [\n        {\n          token: \"string\",\n          regex: \"\\\\\\\\$\",\n          next: \"rawqstring\",\n        },\n        {\n          token: \"string\",\n          regex: \"'|$\",\n          next: \"start\",\n        },\n        {\n          defaultToken: \"string\",\n        },\n      ],\n      fqqstring3: [\n        {\n          token: \"constant.language.escape\",\n          regex: stringEscape,\n        },\n        {\n          token: \"string\", // multi line \"\"\" string end\n          regex: '\"{3}',\n          next: \"start\",\n        },\n        {\n          token: \"paren.lparen\",\n          regex: \"{\",\n          push: \"fqstringParRules\",\n        },\n        {\n          defaultToken: \"string\",\n        },\n      ],\n      fqstring3: [\n        {\n          token: \"constant.language.escape\",\n          regex: stringEscape,\n        },\n        {\n          token: \"string\", // multi line ''' string end\n          regex: \"'{3}\",\n          next: \"start\",\n        },\n        {\n          token: \"paren.lparen\",\n          regex: \"{\",\n          push: \"fqstringParRules\",\n        },\n        {\n          defaultToken: \"string\",\n        },\n      ],\n      fqqstring: [\n        {\n          token: \"constant.language.escape\",\n          regex: stringEscape,\n        },\n        {\n          token: \"string\",\n          regex: \"\\\\\\\\$\",\n          next: \"fqqstring\",\n        },\n        {\n          token: \"string\",\n          regex: '\"|$',\n          next: \"start\",\n        },\n        {\n          token: \"paren.lparen\",\n          regex: \"{\",\n          push: \"fqstringParRules\",\n        },\n        {\n          defaultToken: \"string\",\n        },\n      ],\n      fqstring: [\n        {\n          token: \"constant.language.escape\",\n          regex: stringEscape,\n        },\n        {\n          token: \"string\",\n          regex: \"'|$\",\n          next: \"start\",\n        },\n        {\n          token: \"paren.lparen\",\n          regex: \"{\",\n          push: \"fqstringParRules\",\n        },\n        {\n          defaultToken: \"string\",\n        },\n      ],\n      rfqqstring3: [\n        {\n          token: \"string\", // multi line \"\"\" string end\n          regex: '\"{3}',\n          next: \"start\",\n        },\n        {\n          token: \"paren.lparen\",\n          regex: \"{\",\n          push: \"fqstringParRules\",\n        },\n        {\n          defaultToken: \"string\",\n        },\n      ],\n      rfqstring3: [\n        {\n          token: \"string\", // multi line ''' string end\n          regex: \"'{3}\",\n          next: \"start\",\n        },\n        {\n          token: \"paren.lparen\",\n          regex: \"{\",\n          push: \"fqstringParRules\",\n        },\n        {\n          defaultToken: \"string\",\n        },\n      ],\n      rfqqstring: [\n        {\n          token: \"string\",\n          regex: \"\\\\\\\\$\",\n          next: \"rfqqstring\",\n        },\n        {\n          token: \"string\",\n          regex: '\"|$',\n          next: \"start\",\n        },\n        {\n          token: \"paren.lparen\",\n          regex: \"{\",\n          push: \"fqstringParRules\",\n        },\n        {\n          defaultToken: \"string\",\n        },\n      ],\n      rfqstring: [\n        {\n          token: \"string\",\n          regex: \"'|$\",\n          next: \"start\",\n        },\n        {\n          token: \"paren.lparen\",\n          regex: \"{\",\n          push: \"fqstringParRules\",\n        },\n        {\n          defaultToken: \"string\",\n        },\n      ],\n      fqstringParRules: [\n        {\n          token: \"paren.lparen\",\n          regex: \"[\\\\[\\\\(]\",\n        },\n        {\n          token: \"paren.rparen\",\n          regex: \"[\\\\]\\\\)]\",\n        },\n        {\n          token: \"string\",\n          regex: \"\\\\s+\",\n        },\n        {\n          token: \"string\",\n          regex: \"'[^']*'\",\n        },\n        {\n          token: \"string\",\n          regex: '\"[^\"]*\"',\n        },\n        {\n          token: \"function.support\",\n          regex: \"(!s|!r|!a)\",\n        },\n        {\n          include: \"constants\",\n        },\n        {\n          token: \"paren.rparen\",\n          regex: \"}\",\n          next: \"pop\",\n        },\n        {\n          token: \"paren.lparen\",\n          regex: \"{\",\n          push: \"fqstringParRules\",\n        },\n      ],\n      constants: [\n        {\n          token: \"constant.numeric\", // imaginary\n          regex: \"(?:\" + floatNumber + \"|\\\\d+)[jJ]\\\\b\",\n        },\n        {\n          token: \"constant.numeric\", // float\n          regex: floatNumber,\n        },\n        {\n          token: \"constant.numeric\", // long integer\n          regex: integer + \"[lL]\\\\b\",\n        },\n        {\n          token: \"constant.numeric\", // integer\n          regex: integer + \"\\\\b\",\n        },\n        {\n          token: [\"punctuation\", \"function.support\"], // method\n          regex: \"(\\\\.)([a-zA-Z_]+)\\\\b\",\n        },\n        {\n          token: keywordMapper,\n          regex: \"[a-zA-Z_$][a-zA-Z0-9_$]*\\\\b\",\n        },\n      ],\n    };\n    this.normalizeRules();\n  };\n  oop.inherits(PythonHighlightRules, TextHighlightRules);\n  exports.PythonHighlightRules = PythonHighlightRules;\n});\n\ndefine(\"ace/mode/folding/pythonic\", [\n  \"require\",\n  \"exports\",\n  \"module\",\n  \"ace/lib/oop\",\n  \"ace/mode/folding/fold_mode\",\n], function (require, exports, module) {\n  \"use strict\";\n  var oop = require(\"../../lib/oop\");\n  var BaseFoldMode = require(\"./fold_mode\").FoldMode;\n  var FoldMode = (exports.FoldMode = function (markers) {\n    this.foldingStartMarker = new RegExp(\n      \"([\\\\[{])(?:\\\\s*)$|(\" + markers + \")(?:\\\\s*)(?:#.*)?$\",\n    );\n  });\n  oop.inherits(FoldMode, BaseFoldMode);\n  (function () {\n    this.getFoldWidgetRange = function (session, foldStyle, row) {\n      var line = session.getLine(row);\n      var match = line.match(this.foldingStartMarker);\n      if (match) {\n        if (match[1]) {\n          return this.openingBracketBlock(session, match[1], row, match.index);\n        }\n        if (match[2]) {\n          return this.indentationBlock(\n            session,\n            row,\n            match.index + match[2].length,\n          );\n        }\n        return this.indentationBlock(session, row);\n      }\n    };\n  }).call(FoldMode.prototype);\n});\n\ndefine(\"ace/mode/python\", [\n  \"require\",\n  \"exports\",\n  \"module\",\n  \"ace/lib/oop\",\n  \"ace/mode/text\",\n  \"ace/mode/python_highlight_rules\",\n  \"ace/mode/folding/pythonic\",\n  \"ace/range\",\n], function (require, exports, module) {\n  \"use strict\";\n  var oop = require(\"../lib/oop\");\n  var TextMode = require(\"./text\").Mode;\n  var PythonHighlightRules =\n    require(\"./python_highlight_rules\").PythonHighlightRules;\n  var PythonFoldMode = require(\"./folding/pythonic\").FoldMode;\n  var Range = require(\"../range\").Range;\n  var Mode = function () {\n    this.HighlightRules = PythonHighlightRules;\n    this.foldingRules = new PythonFoldMode(\"\\\\:\");\n    this.$behaviour = this.$defaultBehaviour;\n  };\n  oop.inherits(Mode, TextMode);\n  (function () {\n    this.lineCommentStart = \"#\";\n    this.$pairQuotesAfter = {\n      \"'\": /[ruf]/i,\n      '\"': /[ruf]/i,\n    };\n    this.getNextLineIndent = function (state, line, tab) {\n      var indent = this.$getIndent(line);\n      var tokenizedLine = this.getTokenizer().getLineTokens(line, state);\n      var tokens = tokenizedLine.tokens;\n      if (tokens.length && tokens[tokens.length - 1].type == \"comment\") {\n        return indent;\n      }\n      if (state == \"start\") {\n        var match = line.match(/^.*[\\{\\(\\[:]\\s*$/);\n        if (match) {\n          indent += tab;\n        }\n      }\n      return indent;\n    };\n    var outdents = {\n      pass: 1,\n      return: 1,\n      raise: 1,\n      break: 1,\n      continue: 1,\n    };\n    this.checkOutdent = function (state, line, input) {\n      if (input !== \"\\r\\n\" && input !== \"\\r\" && input !== \"\\n\") {\n        return false;\n      }\n      var tokens = this.getTokenizer().getLineTokens(line.trim(), state).tokens;\n      if (!tokens) {\n        return false;\n      }\n      do {\n        var last = tokens.pop();\n      } while (\n        last &&\n        (last.type == \"comment\" ||\n          (last.type == \"text\" && last.value.match(/^\\s+$/)))\n      );\n      if (!last) {\n        return false;\n      }\n      return last.type == \"keyword\" && outdents[last.value];\n    };\n    this.autoOutdent = function (state, doc, row) {\n      row += 1;\n      var indent = this.$getIndent(doc.getLine(row));\n      var tab = doc.getTabString();\n      if (indent.slice(-tab.length) == tab) {\n        doc.remove(\n          new Range(row, indent.length - tab.length, row, indent.length),\n        );\n      }\n    };\n    this.$id = \"ace/mode/python\";\n    this.snippetFileId = \"ace/snippets/python\";\n  }).call(Mode.prototype);\n  exports.Mode = Mode;\n});\n(function () {\n  window.require([\"ace/mode/python\"], function (m) {\n    if (typeof module == \"object\" && typeof exports == \"object\" && module) {\n      module.exports = m;\n    }\n  });\n})();\n", "define(\"ace/mode/css_highlight_rules\", [\n  \"require\",\n  \"exports\",\n  \"module\",\n  \"ace/lib/oop\",\n  \"ace/lib/lang\",\n  \"ace/mode/text_highlight_rules\",\n], function (require, exports, module) {\n  \"use strict\";\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 =\n    \"align-content|align-items|align-self|all|animation|animation-delay|animation-direction|animation-duration|animation-fill-mode|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|backface-visibility|background|background-attachment|background-blend-mode|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|border|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|bottom|box-shadow|box-sizing|caption-side|clear|clip|color|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|cursor|direction|display|empty-cells|filter|flex|flex-basis|flex-direction|flex-flow|flex-grow|flex-shrink|flex-wrap|float|font|font-family|font-size|font-size-adjust|font-stretch|font-style|font-variant|font-weight|hanging-punctuation|height|justify-content|left|letter-spacing|line-height|list-style|list-style-image|list-style-position|list-style-type|margin|margin-bottom|margin-left|margin-right|margin-top|max-height|max-width|max-zoom|min-height|min-width|min-zoom|nav-down|nav-index|nav-left|nav-right|nav-up|opacity|order|outline|outline-color|outline-offset|outline-style|outline-width|overflow|overflow-x|overflow-y|padding|padding-bottom|padding-left|padding-right|padding-top|page-break-after|page-break-before|page-break-inside|perspective|perspective-origin|position|quotes|resize|right|tab-size|table-layout|text-align|text-align-last|text-decoration|text-decoration-color|text-decoration-line|text-decoration-style|text-indent|text-justify|text-overflow|text-shadow|text-transform|top|transform|transform-origin|transform-style|transition|transition-delay|transition-duration|transition-property|transition-timing-function|unicode-bidi|user-select|user-zoom|vertical-align|visibility|white-space|width|word-break|word-spacing|word-wrap|z-index\");\n  var supportFunction = (exports.supportFunction =\n    \"rgb|rgba|url|attr|counter|counters\");\n  var supportConstant = (exports.supportConstant =\n    \"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|flex-end|flex-start|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|zoom\");\n  var supportConstantColor = (exports.supportConstantColor =\n    \"aliceblue|antiquewhite|aqua|aquamarine|azure|beige|bisque|black|blanchedalmond|blue|blueviolet|brown|burlywood|cadetblue|chartreuse|chocolate|coral|cornflowerblue|cornsilk|crimson|cyan|darkblue|darkcyan|darkgoldenrod|darkgray|darkgreen|darkgrey|darkkhaki|darkmagenta|darkolivegreen|darkorange|darkorchid|darkred|darksalmon|darkseagreen|darkslateblue|darkslategray|darkslategrey|darkturquoise|darkviolet|deeppink|deepskyblue|dimgray|dimgrey|dodgerblue|firebrick|floralwhite|forestgreen|fuchsia|gainsboro|ghostwhite|gold|goldenrod|gray|green|greenyellow|grey|honeydew|hotpink|indianred|indigo|ivory|khaki|lavender|lavenderblush|lawngreen|lemonchiffon|lightblue|lightcoral|lightcyan|lightgoldenrodyellow|lightgray|lightgreen|lightgrey|lightpink|lightsalmon|lightseagreen|lightskyblue|lightslategray|lightslategrey|lightsteelblue|lightyellow|lime|limegreen|linen|magenta|maroon|mediumaquamarine|mediumblue|mediumorchid|mediumpurple|mediumseagreen|mediumslateblue|mediumspringgreen|mediumturquoise|mediumvioletred|midnightblue|mintcream|mistyrose|moccasin|navajowhite|navy|oldlace|olive|olivedrab|orange|orangered|orchid|palegoldenrod|palegreen|paleturquoise|palevioletred|papayawhip|peachpuff|peru|pink|plum|powderblue|purple|rebeccapurple|red|rosybrown|royalblue|saddlebrown|salmon|sandybrown|seagreen|seashell|sienna|silver|skyblue|slateblue|slategray|slategrey|snow|springgreen|steelblue|tan|teal|thistle|tomato|turquoise|violet|wheat|white|whitesmoke|yellow|yellowgreen\");\n  var supportConstantFonts = (exports.supportConstantFonts =\n    \"arial|century|comic|courier|cursive|fantasy|garamond|georgia|helvetica|impact|lucida|symbol|system|tahoma|times|trebuchet|utopia|verdana|webdings|sans-serif|serif|monospace\");\n  var numRe = (exports.numRe =\n    \"\\\\-?(?:(?:[0-9]+(?:\\\\.[0-9]+)?)|(?:\\\\.[0-9]+))\");\n  var pseudoElements = (exports.pseudoElements =\n    \"(\\\\:+)\\\\b(after|before|first-letter|first-line|moz-selection|selection)\\\\b\");\n  var pseudoClasses = (exports.pseudoClasses =\n    \"(:)\\\\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  var CssHighlightRules = function () {\n    var keywordMapper = this.createKeywordMapper(\n      {\n        \"support.function\": supportFunction,\n        \"support.constant\": supportConstant,\n        \"support.type\": supportType,\n        \"support.constant.color\": supportConstantColor,\n        \"support.constant.fonts\": supportConstantFonts,\n      },\n      \"text\",\n      true,\n    );\n    this.$rules = {\n      start: [\n        {\n          include: [\"strings\", \"url\", \"comments\"],\n        },\n        {\n          token: \"paren.lparen\",\n          regex: \"\\\\{\",\n          next: \"ruleset\",\n        },\n        {\n          token: \"paren.rparen\",\n          regex: \"\\\\}\",\n        },\n        {\n          token: \"string\",\n          regex: \"@(?!viewport)\",\n          next: \"media\",\n        },\n        {\n          token: \"keyword\",\n          regex: \"#[a-z0-9-_]+\",\n        },\n        {\n          token: \"keyword\",\n          regex: \"%\",\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.numeric\",\n          regex: numRe,\n        },\n        {\n          token: \"constant\",\n          regex: \"[a-z0-9-_]+\",\n        },\n        {\n          caseInsensitive: true,\n        },\n      ],\n      media: [\n        {\n          include: [\"strings\", \"url\", \"comments\"],\n        },\n        {\n          token: \"paren.lparen\",\n          regex: \"\\\\{\",\n          next: \"start\",\n        },\n        {\n          token: \"paren.rparen\",\n          regex: \"\\\\}\",\n          next: \"start\",\n        },\n        {\n          token: \"string\",\n          regex: \";\",\n          next: \"start\",\n        },\n        {\n          token: \"keyword\",\n          regex:\n            \"(?:media|supports|document|charset|import|namespace|media|supports|document\" +\n            \"|page|font|keyframes|viewport|counter-style|font-feature-values\" +\n            \"|swash|ornaments|annotation|stylistic|styleset|character-variant)\",\n        },\n      ],\n      comments: [\n        {\n          token: \"comment\", // multi line comment\n          regex: \"\\\\/\\\\*\",\n          push: [\n            {\n              token: \"comment\",\n              regex: \"\\\\*\\\\/\",\n              next: \"pop\",\n            },\n            {\n              defaultToken: \"comment\",\n            },\n          ],\n        },\n      ],\n      ruleset: [\n        {\n          regex: \"-(webkit|ms|moz|o)-\",\n          token: \"text\",\n        },\n        {\n          token: \"punctuation.operator\",\n          regex: \"[:;]\",\n        },\n        {\n          token: \"paren.rparen\",\n          regex: \"\\\\}\",\n          next: \"start\",\n        },\n        {\n          include: [\"strings\", \"url\", \"comments\"],\n        },\n        {\n          token: [\"constant.numeric\", \"keyword\"],\n          regex:\n            \"(\" +\n            numRe +\n            \")(ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vmax|vmin|vm|vw|%)\",\n        },\n        {\n          token: \"constant.numeric\",\n          regex: numRe,\n        },\n        {\n          token: \"constant.numeric\", // hex6 color\n          regex: \"#[a-f0-9]{6}\",\n        },\n        {\n          token: \"constant.numeric\", // hex3 color\n          regex: \"#[a-f0-9]{3}\",\n        },\n        {\n          token: [\n            \"punctuation\",\n            \"entity.other.attribute-name.pseudo-element.css\",\n          ],\n          regex: pseudoElements,\n        },\n        {\n          token: [\n            \"punctuation\",\n            \"entity.other.attribute-name.pseudo-class.css\",\n          ],\n          regex: pseudoClasses,\n        },\n        {\n          include: \"url\",\n        },\n        {\n          token: keywordMapper,\n          regex: \"\\\\-?[a-zA-Z_][a-zA-Z0-9_\\\\-]*\",\n        },\n        {\n          caseInsensitive: true,\n        },\n      ],\n      url: [\n        {\n          token: \"support.function\",\n          regex: \"(?:url(:?-prefix)?|domain|regexp)\\\\(\",\n          push: [\n            {\n              token: \"support.function\",\n              regex: \"\\\\)\",\n              next: \"pop\",\n            },\n            {\n              defaultToken: \"string\",\n            },\n          ],\n        },\n      ],\n      strings: [\n        {\n          token: \"string.start\",\n          regex: \"'\",\n          push: [\n            {\n              token: \"string.end\",\n              regex: \"'|$\",\n              next: \"pop\",\n            },\n            {\n              include: \"escapes\",\n            },\n            {\n              token: \"constant.language.escape\",\n              regex: /\\\\$/,\n              consumeLineEnd: true,\n            },\n            {\n              defaultToken: \"string\",\n            },\n          ],\n        },\n        {\n          token: \"string.start\",\n          regex: '\"',\n          push: [\n            {\n              token: \"string.end\",\n              regex: '\"|$',\n              next: \"pop\",\n            },\n            {\n              include: \"escapes\",\n            },\n            {\n              token: \"constant.language.escape\",\n              regex: /\\\\$/,\n              consumeLineEnd: true,\n            },\n            {\n              defaultToken: \"string\",\n            },\n          ],\n        },\n      ],\n      escapes: [\n        {\n          token: \"constant.language.escape\",\n          regex: /\\\\([a-fA-F\\d]{1,6}|[^a-fA-F\\d])/,\n        },\n      ],\n    };\n    this.normalizeRules();\n  };\n  oop.inherits(CssHighlightRules, TextHighlightRules);\n  exports.CssHighlightRules = CssHighlightRules;\n});\n\ndefine(\"ace/mode/scss_highlight_rules\", [\n  \"require\",\n  \"exports\",\n  \"module\",\n  \"ace/lib/oop\",\n  \"ace/lib/lang\",\n  \"ace/mode/text_highlight_rules\",\n  \"ace/mode/css_highlight_rules\",\n], function (require, exports, module) {\n  \"use strict\";\n  var oop = require(\"../lib/oop\");\n  var lang = require(\"../lib/lang\");\n  var TextHighlightRules = require(\"./text_highlight_rules\").TextHighlightRules;\n  var CssHighlightRules = require(\"./css_highlight_rules\");\n  var ScssHighlightRules = function () {\n    var properties = lang.arrayToMap(CssHighlightRules.supportType.split(\"|\"));\n    var functions = lang.arrayToMap(\n      (\n        \"hsl|hsla|rgb|rgba|url|attr|counter|counters|abs|adjust_color|adjust_hue|\" +\n        \"alpha|join|blue|ceil|change_color|comparable|complement|darken|desaturate|\" +\n        \"floor|grayscale|green|hue|if|invert|join|length|lighten|lightness|mix|\" +\n        \"nth|opacify|opacity|percentage|quote|red|round|saturate|saturation|\" +\n        \"scale_color|transparentize|type_of|unit|unitless|unquote\"\n      ).split(\"|\"),\n    );\n    var constants = lang.arrayToMap(\n      CssHighlightRules.supportConstant.split(\"|\"),\n    );\n    var colors = lang.arrayToMap(\n      CssHighlightRules.supportConstantColor.split(\"|\"),\n    );\n    var keywords = lang.arrayToMap(\n      \"@mixin|@extend|@include|@import|@media|@debug|@warn|@if|@for|@each|@while|@else|@font-face|@-webkit-keyframes|if|and|!default|module|def|end|declare\".split(\n        \"|\",\n      ),\n    );\n    var tags = lang.arrayToMap(\n      (\n        \"a|abbr|acronym|address|applet|area|article|aside|audio|b|base|basefont|bdo|\" +\n        \"big|blockquote|body|br|button|canvas|caption|center|cite|code|col|colgroup|\" +\n        \"command|datalist|dd|del|details|dfn|dir|div|dl|dt|em|embed|fieldset|\" +\n        \"figcaption|figure|font|footer|form|frame|frameset|h1|h2|h3|h4|h5|h6|head|\" +\n        \"header|hgroup|hr|html|i|iframe|img|input|ins|keygen|kbd|label|legend|li|\" +\n        \"link|map|mark|menu|meta|meter|nav|noframes|noscript|object|ol|optgroup|\" +\n        \"option|output|p|param|pre|progress|q|rp|rt|ruby|s|samp|script|section|select|\" +\n        \"small|source|span|strike|strong|style|sub|summary|sup|table|tbody|td|\" +\n        \"textarea|tfoot|th|thead|time|title|tr|tt|u|ul|var|video|wbr|xmp\"\n      ).split(\"|\"),\n    );\n    var numRe = \"\\\\-?(?:(?:[0-9]+)|(?:[0-9]*\\\\.[0-9]+))\";\n    this.$rules = {\n      start: [\n        {\n          token: \"comment\",\n          regex: \"\\\\/\\\\/.*$\",\n        },\n        {\n          token: \"comment\", // multi line comment\n          regex: \"\\\\/\\\\*\",\n          next: \"comment\",\n        },\n        {\n          token: \"string\", // single line\n          regex: '[\"](?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?[\"]',\n        },\n        {\n          token: \"string\", // multi line string start\n          regex: '[\"].*\\\\\\\\$',\n          next: \"qqstring\",\n        },\n        {\n          token: \"string\", // single line\n          regex: \"['](?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?[']\",\n        },\n        {\n          token: \"string\", // multi line string start\n          regex: \"['].*\\\\\\\\$\",\n          next: \"qstring\",\n        },\n        {\n          token: \"constant.numeric\",\n          regex:\n            numRe +\n            \"(?:ch|cm|deg|em|ex|fr|gd|grad|Hz|in|kHz|mm|ms|pc|pt|px|rad|rem|s|turn|vh|vmax|vmin|vm|vw|%)\",\n        },\n        {\n          token: \"constant.numeric\", // hex6 color\n          regex: \"#[a-f0-9]{6}\",\n        },\n        {\n          token: \"constant.numeric\", // hex3 color\n          regex: \"#[a-f0-9]{3}\",\n        },\n        {\n          token: \"constant.numeric\",\n          regex: numRe,\n        },\n        {\n          token: [\"support.function\", \"string\", \"support.function\"],\n          regex: \"(url\\\\()(.*)(\\\\))\",\n        },\n        {\n          token: function (value) {\n            if (properties.hasOwnProperty(value.toLowerCase())) {\n              return \"support.type\";\n            }\n            if (keywords.hasOwnProperty(value)) {\n              return \"keyword\";\n            } else if (constants.hasOwnProperty(value)) {\n              return \"constant.language\";\n            } else if (functions.hasOwnProperty(value)) {\n              return \"support.function\";\n            } else if (colors.hasOwnProperty(value.toLowerCase())) {\n              return \"support.constant.color\";\n            } else if (tags.hasOwnProperty(value.toLowerCase())) {\n              return \"variable.language\";\n            } else {\n              return \"text\";\n            }\n          },\n          regex: \"\\\\-?[@a-z_][@a-z0-9_\\\\-]*\",\n        },\n        {\n          token: \"variable\",\n          regex: \"[a-z_\\\\-$][a-z0-9_\\\\-$]*\\\\b\",\n        },\n        {\n          token: \"variable.language\",\n          regex: \"#[a-z0-9-_]+\",\n        },\n        {\n          token: \"variable.language\",\n          regex: \"\\\\.[a-z0-9-_]+\",\n        },\n        {\n          token: \"variable.language\",\n          regex: \":[a-z0-9-_]+\",\n        },\n        {\n          token: \"constant\",\n          regex: \"[a-z0-9-_]+\",\n        },\n        {\n          token: \"keyword.operator\",\n          regex: \"<|>|<=|>=|==|!=|-|%|#|\\\\+|\\\\$|\\\\+|\\\\*\",\n        },\n        {\n          token: \"paren.lparen\",\n          regex: \"[[({]\",\n        },\n        {\n          token: \"paren.rparen\",\n          regex: \"[\\\\])}]\",\n        },\n        {\n          token: \"text\",\n          regex: \"\\\\s+\",\n        },\n        {\n          caseInsensitive: true,\n        },\n      ],\n      comment: [\n        {\n          token: \"comment\", // closing comment\n          regex: \"\\\\*\\\\/\",\n          next: \"start\",\n        },\n        {\n          defaultToken: \"comment\",\n        },\n      ],\n      qqstring: [\n        {\n          token: \"string\",\n          regex: '(?:(?:\\\\\\\\.)|(?:[^\"\\\\\\\\]))*?\"',\n          next: \"start\",\n        },\n        {\n          token: \"string\",\n          regex: \".+\",\n        },\n      ],\n      qstring: [\n        {\n          token: \"string\",\n          regex: \"(?:(?:\\\\\\\\.)|(?:[^'\\\\\\\\]))*?'\",\n          next: \"start\",\n        },\n        {\n          token: \"string\",\n          regex: \".+\",\n        },\n      ],\n    };\n  };\n  oop.inherits(ScssHighlightRules, TextHighlightRules);\n  exports.ScssHighlightRules = ScssHighlightRules;\n});\n\ndefine(\"ace/mode/matching_brace_outdent\", [\n  \"require\",\n  \"exports\",\n  \"module\",\n  \"ace/range\",\n], function (require, exports, module) {\n  \"use strict\";\n  var Range = require(\"../range\").Range;\n  var MatchingBraceOutdent = function () {};\n  (function () {\n    this.checkOutdent = function (line, input) {\n      if (!/^\\s+$/.test(line)) {\n        return false;\n      }\n      return /^\\s*\\}/.test(input);\n    };\n    this.autoOutdent = function (doc, row) {\n      var line = doc.getLine(row);\n      var match = line.match(/^(\\s*\\})/);\n      if (!match) {\n        return 0;\n      }\n      var column = match[1].length;\n      var openBracePos = doc.findMatchingBracket({ row: row, column: column });\n      if (!openBracePos || openBracePos.row == row) {\n        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    this.$getIndent = function (line) {\n      return line.match(/^\\s*/)[0];\n    };\n  }).call(MatchingBraceOutdent.prototype);\n  exports.MatchingBraceOutdent = MatchingBraceOutdent;\n});\n\ndefine(\"ace/mode/behaviour/css\", [\n  \"require\",\n  \"exports\",\n  \"module\",\n  \"ace/lib/oop\",\n  \"ace/mode/behaviour\",\n  \"ace/mode/behaviour/cstyle\",\n  \"ace/token_iterator\",\n], function (require, exports, module) {\n  \"use strict\";\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  var CssBehaviour = function () {\n    this.inherit(CstyleBehaviour);\n    this.add(\n      \"colon\",\n      \"insertion\",\n      function (state, action, editor, session, text) {\n        if (text === \":\" && editor.selection.isEmpty()) {\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 (/^(\\s+[^;]|\\s*$)/.test(line.substring(cursor.column))) {\n              return {\n                text: \":;\",\n                selection: [1, 1],\n              };\n            }\n          }\n        }\n      },\n    );\n    this.add(\n      \"colon\",\n      \"deletion\",\n      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(\n              range.end.column,\n              range.end.column + 1,\n            );\n            if (rightChar === \";\") {\n              range.end.column++;\n              return range;\n            }\n          }\n        }\n      },\n    );\n    this.add(\n      \"semicolon\",\n      \"insertion\",\n      function (state, action, editor, session, text) {\n        if (text === \";\" && editor.selection.isEmpty()) {\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    this.add(\n      \"!important\",\n      \"insertion\",\n      function (state, action, editor, session, text) {\n        if (text === \"!\" && editor.selection.isEmpty()) {\n          var cursor = editor.getCursorPosition();\n          var line = session.doc.getLine(cursor.row);\n          if (/^\\s*(;|}|$)/.test(line.substring(cursor.column))) {\n            return {\n              text: \"!important\",\n              selection: [10, 10],\n            };\n          }\n        }\n      },\n    );\n  };\n  oop.inherits(CssBehaviour, CstyleBehaviour);\n  exports.CssBehaviour = CssBehaviour;\n});\n\ndefine(\"ace/mode/folding/cstyle\", [\n  \"require\",\n  \"exports\",\n  \"module\",\n  \"ace/lib/oop\",\n  \"ace/range\",\n  \"ace/mode/folding/fold_mode\",\n], function (require, exports, module) {\n  \"use strict\";\n  var oop = require(\"../../lib/oop\");\n  var Range = require(\"../../range\").Range;\n  var BaseFoldMode = require(\"./fold_mode\").FoldMode;\n  var FoldMode = (exports.FoldMode = function (commentRegex) {\n    if (commentRegex) {\n      this.foldingStartMarker = new RegExp(\n        this.foldingStartMarker.source.replace(\n          /\\|[^|]*?$/,\n          \"|\" + commentRegex.start,\n        ),\n      );\n      this.foldingStopMarker = new RegExp(\n        this.foldingStopMarker.source.replace(\n          /\\|[^|]*?$/,\n          \"|\" + commentRegex.end,\n        ),\n      );\n    }\n  });\n  oop.inherits(FoldMode, BaseFoldMode);\n  (function () {\n    this.foldingStartMarker = /([\\{\\[\\(])[^\\}\\]\\)]*$|^\\s*(\\/\\*)/;\n    this.foldingStopMarker = /^[^\\[\\{\\(]*([\\}\\]\\)])|^[\\s\\*]*(\\*\\/)/;\n    this.singleLineBlockCommentRe = /^\\s*(\\/\\*).*\\*\\/\\s*$/;\n    this.tripleStarBlockCommentRe = /^\\s*(\\/\\*\\*\\*).*\\*\\/\\s*$/;\n    this.startRegionRe = /^\\s*(\\/\\*|\\/\\/)#?region\\b/;\n    this._getFoldWidgetBase = this.getFoldWidget;\n    this.getFoldWidget = function (session, foldStyle, row) {\n      var line = session.getLine(row);\n      if (this.singleLineBlockCommentRe.test(line)) {\n        if (\n          !this.startRegionRe.test(line) &&\n          !this.tripleStarBlockCommentRe.test(line)\n        ) {\n          return \"\";\n        }\n      }\n      var fw = this._getFoldWidgetBase(session, foldStyle, row);\n      if (!fw && this.startRegionRe.test(line)) {\n        return \"start\";\n      } // lineCommentRegionStart\n      return fw;\n    };\n    this.getFoldWidgetRange = function (\n      session,\n      foldStyle,\n      row,\n      forceMultiline,\n    ) {\n      var line = session.getLine(row);\n      if (this.startRegionRe.test(line)) {\n        return this.getCommentRegionBlock(session, line, row);\n      }\n      var match = line.match(this.foldingStartMarker);\n      if (match) {\n        var i = match.index;\n        if (match[1]) {\n          return this.openingBracketBlock(session, match[1], row, i);\n        }\n        var range = session.getCommentFoldRange(row, i + match[0].length, 1);\n        if (range && !range.isMultiLine()) {\n          if (forceMultiline) {\n            range = this.getSectionRange(session, row);\n          } else if (foldStyle != \"all\") {\n            range = null;\n          }\n        }\n        return range;\n      }\n      if (foldStyle === \"markbegin\") {\n        return;\n      }\n      var match = line.match(this.foldingStopMarker);\n      if (match) {\n        var i = match.index + match[0].length;\n        if (match[1]) {\n          return this.closingBracketBlock(session, match[1], row, i);\n        }\n        return session.getCommentFoldRange(row, i, -1);\n      }\n    };\n    this.getSectionRange = function (session, row) {\n      var line = session.getLine(row);\n      var startIndent = line.search(/\\S/);\n      var startRow = row;\n      var startColumn = line.length;\n      row = row + 1;\n      var endRow = row;\n      var maxRow = session.getLength();\n      while (++row < maxRow) {\n        line = session.getLine(row);\n        var indent = line.search(/\\S/);\n        if (indent === -1) {\n          continue;\n        }\n        if (startIndent > indent) {\n          break;\n        }\n        var subRange = this.getFoldWidgetRange(session, \"all\", row);\n        if (subRange) {\n          if (subRange.start.row <= startRow) {\n            break;\n          } else if (subRange.isMultiLine()) {\n            row = subRange.end.row;\n          } else if (startIndent == indent) {\n            break;\n          }\n        }\n        endRow = row;\n      }\n      return new Range(\n        startRow,\n        startColumn,\n        endRow,\n        session.getLine(endRow).length,\n      );\n    };\n    this.getCommentRegionBlock = function (session, line, row) {\n      var startColumn = line.search(/\\s*$/);\n      var maxRow = session.getLength();\n      var startRow = row;\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        }\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        return new Range(startRow, startColumn, endRow, line.length);\n      }\n    };\n  }).call(FoldMode.prototype);\n});\n\ndefine(\"ace/mode/css_completions\", [\"require\", \"exports\", \"module\"], function (\n  require,\n  exports,\n  module,\n) {\n  \"use strict\";\n  var propertyMap = {\n    background: { \"#$0\": 1 },\n    \"background-color\": { \"#$0\": 1, transparent: 1, fixed: 1 },\n    \"background-image\": { \"url('/$0')\": 1 },\n    \"background-repeat\": {\n      repeat: 1,\n      \"repeat-x\": 1,\n      \"repeat-y\": 1,\n      \"no-repeat\": 1,\n      inherit: 1,\n    },\n    \"background-position\": {\n      bottom: 2,\n      center: 2,\n      left: 2,\n      right: 2,\n      top: 2,\n      inherit: 2,\n    },\n    \"background-attachment\": { scroll: 1, fixed: 1 },\n    \"background-size\": { cover: 1, contain: 1 },\n    \"background-clip\": { \"border-box\": 1, \"padding-box\": 1, \"content-box\": 1 },\n    \"background-origin\": {\n      \"border-box\": 1,\n      \"padding-box\": 1,\n      \"content-box\": 1,\n    },\n    border: { \"solid $0\": 1, \"dashed $0\": 1, \"dotted $0\": 1, \"#$0\": 1 },\n    \"border-color\": { \"#$0\": 1 },\n    \"border-style\": {\n      solid: 2,\n      dashed: 2,\n      dotted: 2,\n      double: 2,\n      groove: 2,\n      hidden: 2,\n      inherit: 2,\n      inset: 2,\n      none: 2,\n      outset: 2,\n      ridged: 2,\n    },\n    \"border-collapse\": { collapse: 1, separate: 1 },\n    bottom: { px: 1, em: 1, \"%\": 1 },\n    clear: { left: 1, right: 1, both: 1, none: 1 },\n    color: { \"#$0\": 1, \"rgb(#$00,0,0)\": 1 },\n    cursor: {\n      default: 1,\n      pointer: 1,\n      move: 1,\n      text: 1,\n      wait: 1,\n      help: 1,\n      progress: 1,\n      \"n-resize\": 1,\n      \"ne-resize\": 1,\n      \"e-resize\": 1,\n      \"se-resize\": 1,\n      \"s-resize\": 1,\n      \"sw-resize\": 1,\n      \"w-resize\": 1,\n      \"nw-resize\": 1,\n    },\n    display: {\n      none: 1,\n      block: 1,\n      inline: 1,\n      \"inline-block\": 1,\n      \"table-cell\": 1,\n    },\n    \"empty-cells\": { show: 1, hide: 1 },\n    float: { left: 1, right: 1, none: 1 },\n    \"font-family\": {\n      Arial: 2,\n      \"Comic Sans MS\": 2,\n      Consolas: 2,\n      \"Courier New\": 2,\n      Courier: 2,\n      Georgia: 2,\n      Monospace: 2,\n      \"Sans-Serif\": 2,\n      \"Segoe UI\": 2,\n      Tahoma: 2,\n      \"Times New Roman\": 2,\n      \"Trebuchet MS\": 2,\n      Verdana: 1,\n    },\n    \"font-size\": { px: 1, em: 1, \"%\": 1 },\n    \"font-weight\": { bold: 1, normal: 1 },\n    \"font-style\": { italic: 1, normal: 1 },\n    \"font-variant\": { normal: 1, \"small-caps\": 1 },\n    height: { px: 1, em: 1, \"%\": 1 },\n    left: { px: 1, em: 1, \"%\": 1 },\n    \"letter-spacing\": { normal: 1 },\n    \"line-height\": { normal: 1 },\n    \"list-style-type\": {\n      none: 1,\n      disc: 1,\n      circle: 1,\n      square: 1,\n      decimal: 1,\n      \"decimal-leading-zero\": 1,\n      \"lower-roman\": 1,\n      \"upper-roman\": 1,\n      \"lower-greek\": 1,\n      \"lower-latin\": 1,\n      \"upper-latin\": 1,\n      georgian: 1,\n      \"lower-alpha\": 1,\n      \"upper-alpha\": 1,\n    },\n    margin: { px: 1, em: 1, \"%\": 1 },\n    \"margin-right\": { px: 1, em: 1, \"%\": 1 },\n    \"margin-left\": { px: 1, em: 1, \"%\": 1 },\n    \"margin-top\": { px: 1, em: 1, \"%\": 1 },\n    \"margin-bottom\": { px: 1, em: 1, \"%\": 1 },\n    \"max-height\": { px: 1, em: 1, \"%\": 1 },\n    \"max-width\": { px: 1, em: 1, \"%\": 1 },\n    \"min-height\": { px: 1, em: 1, \"%\": 1 },\n    \"min-width\": { px: 1, em: 1, \"%\": 1 },\n    overflow: { hidden: 1, visible: 1, auto: 1, scroll: 1 },\n    \"overflow-x\": { hidden: 1, visible: 1, auto: 1, scroll: 1 },\n    \"overflow-y\": { hidden: 1, visible: 1, auto: 1, scroll: 1 },\n    padding: { px: 1, em: 1, \"%\": 1 },\n    \"padding-top\": { px: 1, em: 1, \"%\": 1 },\n    \"padding-right\": { px: 1, em: 1, \"%\": 1 },\n    \"padding-bottom\": { px: 1, em: 1, \"%\": 1 },\n    \"padding-left\": { px: 1, em: 1, \"%\": 1 },\n    \"page-break-after\": { auto: 1, always: 1, avoid: 1, left: 1, right: 1 },\n    \"page-break-before\": { auto: 1, always: 1, avoid: 1, left: 1, right: 1 },\n    position: { absolute: 1, relative: 1, fixed: 1, static: 1 },\n    right: { px: 1, em: 1, \"%\": 1 },\n    \"table-layout\": { fixed: 1, auto: 1 },\n    \"text-decoration\": { none: 1, underline: 1, \"line-through\": 1, blink: 1 },\n    \"text-align\": { left: 1, right: 1, center: 1, justify: 1 },\n    \"text-transform\": { capitalize: 1, uppercase: 1, lowercase: 1, none: 1 },\n    top: { px: 1, em: 1, \"%\": 1 },\n    \"vertical-align\": { top: 1, bottom: 1 },\n    visibility: { hidden: 1, visible: 1 },\n    \"white-space\": {\n      nowrap: 1,\n      normal: 1,\n      pre: 1,\n      \"pre-line\": 1,\n      \"pre-wrap\": 1,\n    },\n    width: { px: 1, em: 1, \"%\": 1 },\n    \"word-spacing\": { normal: 1 },\n    filter: { \"alpha(opacity=$0100)\": 1 },\n    \"text-shadow\": { \"$02px 2px 2px #777\": 1 },\n    \"text-overflow\": { \"ellipsis-word\": 1, clip: 1, ellipsis: 1 },\n    \"-moz-border-radius\": 1,\n    \"-moz-border-radius-topright\": 1,\n    \"-moz-border-radius-bottomright\": 1,\n    \"-moz-border-radius-topleft\": 1,\n    \"-moz-border-radius-bottomleft\": 1,\n    \"-webkit-border-radius\": 1,\n    \"-webkit-border-top-right-radius\": 1,\n    \"-webkit-border-top-left-radius\": 1,\n    \"-webkit-border-bottom-right-radius\": 1,\n    \"-webkit-border-bottom-left-radius\": 1,\n    \"-moz-box-shadow\": 1,\n    \"-webkit-box-shadow\": 1,\n    transform: { \"rotate($00deg)\": 1, \"skew($00deg)\": 1 },\n    \"-moz-transform\": { \"rotate($00deg)\": 1, \"skew($00deg)\": 1 },\n    \"-webkit-transform\": { \"rotate($00deg)\": 1, \"skew($00deg)\": 1 },\n  };\n  var CssCompletions = function () {};\n  (function () {\n    this.completionsDefined = false;\n    this.defineCompletions = function () {\n      if (document) {\n        var style = document.createElement(\"c\").style;\n        for (var i in style) {\n          if (typeof style[i] !== \"string\") {\n            continue;\n          }\n          var name = i.replace(/[A-Z]/g, function (x) {\n            return \"-\" + x.toLowerCase();\n          });\n          if (!propertyMap.hasOwnProperty(name)) {\n            propertyMap[name] = 1;\n          }\n        }\n      }\n      this.completionsDefined = true;\n    };\n    this.getCompletions = function (state, session, pos, prefix) {\n      if (!this.completionsDefined) {\n        this.defineCompletions();\n      }\n      if (state === \"ruleset\" || session.$mode.$id == \"ace/mode/scss\") {\n        var line = session.getLine(pos.row).substr(0, pos.column);\n        var inParens = /\\([^)]*$/.test(line);\n        if (inParens) {\n          line = line.substr(line.lastIndexOf(\"(\") + 1);\n        }\n        if (/:[^;]+$/.test(line)) {\n          /([\\w\\-]+):[^:]*$/.test(line);\n          return this.getPropertyValueCompletions(state, session, pos, prefix);\n        } else {\n          return this.getPropertyCompletions(\n            state,\n            session,\n            pos,\n            prefix,\n            inParens,\n          );\n        }\n      }\n      return [];\n    };\n    this.getPropertyCompletions = function (\n      state,\n      session,\n      pos,\n      prefix,\n      skipSemicolon,\n    ) {\n      skipSemicolon = skipSemicolon || false;\n      var properties = Object.keys(propertyMap);\n      return properties.map(function (property) {\n        return {\n          caption: property,\n          snippet: property + \": $0\" + (skipSemicolon ? \"\" : \";\"),\n          meta: \"property\",\n          score: 1000000,\n        };\n      });\n    };\n    this.getPropertyValueCompletions = function (state, session, pos, prefix) {\n      var line = session.getLine(pos.row).substr(0, pos.column);\n      var property = (/([\\w\\-]+):[^:]*$/.exec(line) || {})[1];\n      if (!property) {\n        return [];\n      }\n      var values = [];\n      if (\n        property in propertyMap &&\n        typeof propertyMap[property] === \"object\"\n      ) {\n        values = Object.keys(propertyMap[property]);\n      }\n      return values.map(function (value) {\n        return {\n          caption: value,\n          snippet: value,\n          meta: \"property value\",\n          score: 1000000,\n        };\n      });\n    };\n  }).call(CssCompletions.prototype);\n  exports.CssCompletions = CssCompletions;\n});\n\ndefine(\"ace/mode/scss\", [\n  \"require\",\n  \"exports\",\n  \"module\",\n  \"ace/lib/oop\",\n  \"ace/mode/text\",\n  \"ace/mode/scss_highlight_rules\",\n  \"ace/mode/matching_brace_outdent\",\n  \"ace/mode/behaviour/css\",\n  \"ace/mode/folding/cstyle\",\n  \"ace/mode/css_completions\",\n], function (require, exports, module) {\n  \"use strict\";\n  var oop = require(\"../lib/oop\");\n  var TextMode = require(\"./text\").Mode;\n  var ScssHighlightRules = require(\"./scss_highlight_rules\").ScssHighlightRules;\n  var MatchingBraceOutdent =\n    require(\"./matching_brace_outdent\").MatchingBraceOutdent;\n  var CssBehaviour = require(\"./behaviour/css\").CssBehaviour;\n  var CStyleFoldMode = require(\"./folding/cstyle\").FoldMode;\n  var CssCompletions = require(\"./css_completions\").CssCompletions;\n  var Mode = function () {\n    this.HighlightRules = ScssHighlightRules;\n    this.$outdent = new MatchingBraceOutdent();\n    this.$behaviour = new CssBehaviour();\n    this.$completer = new CssCompletions();\n    this.foldingRules = new CStyleFoldMode();\n  };\n  oop.inherits(Mode, TextMode);\n  (function () {\n    this.lineCommentStart = \"//\";\n    this.blockComment = { start: \"/*\", end: \"*/\" };\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      var match = line.match(/^.*\\{\\s*$/);\n      if (match) {\n        indent += tab;\n      }\n      return indent;\n    };\n    this.checkOutdent = function (state, line, input) {\n      return this.$outdent.checkOutdent(line, input);\n    };\n    this.autoOutdent = function (state, doc, row) {\n      this.$outdent.autoOutdent(doc, row);\n    };\n    this.getCompletions = function (state, session, pos, prefix) {\n      return this.$completer.getCompletions(state, session, pos, prefix);\n    };\n    this.$id = \"ace/mode/scss\";\n  }).call(Mode.prototype);\n  exports.Mode = Mode;\n});\n(function () {\n  window.require([\"ace/mode/scss\"], function (m) {\n    if (typeof module == \"object\" && typeof exports == \"object\" && module) {\n      module.exports = m;\n    }\n  });\n})();\n", "define(\"ace/theme/monokai-css\", [\"require\", \"exports\", \"module\"], function (\n  require,\n  exports,\n  module,\n) {\n  module.exports =\n    \".ace-monokai .ace_gutter {\\n  background: #2F3129;\\n  color: #8F908A\\n}\\n\\n.ace-monokai .ace_print-margin {\\n  width: 1px;\\n  background: #555651\\n}\\n\\n.ace-monokai {\\n  background-color: #272822;\\n  color: #F8F8F2\\n}\\n\\n.ace-monokai .ace_cursor {\\n  color: #F8F8F0\\n}\\n\\n.ace-monokai .ace_marker-layer .ace_selection {\\n  background: #49483E\\n}\\n\\n.ace-monokai.ace_multiselect .ace_selection.ace_start {\\n  box-shadow: 0 0 3px 0px #272822;\\n}\\n\\n.ace-monokai .ace_marker-layer .ace_step {\\n  background: rgb(102, 82, 0)\\n}\\n\\n.ace-monokai .ace_marker-layer .ace_bracket {\\n  margin: -1px 0 0 -1px;\\n  border: 1px solid #49483E\\n}\\n\\n.ace-monokai .ace_marker-layer .ace_active-line {\\n  background: #202020\\n}\\n\\n.ace-monokai .ace_gutter-active-line {\\n  background-color: #272727\\n}\\n\\n.ace-monokai .ace_marker-layer .ace_selected-word {\\n  border: 1px solid #49483E\\n}\\n\\n.ace-monokai .ace_invisible {\\n  color: #52524d\\n}\\n\\n.ace-monokai .ace_entity.ace_name.ace_tag,\\n.ace-monokai .ace_keyword,\\n.ace-monokai .ace_meta.ace_tag,\\n.ace-monokai .ace_storage {\\n  color: #F92672\\n}\\n\\n.ace-monokai .ace_punctuation,\\n.ace-monokai .ace_punctuation.ace_tag {\\n  color: #fff\\n}\\n\\n.ace-monokai .ace_constant.ace_character,\\n.ace-monokai .ace_constant.ace_language,\\n.ace-monokai .ace_constant.ace_numeric,\\n.ace-monokai .ace_constant.ace_other {\\n  color: #AE81FF\\n}\\n\\n.ace-monokai .ace_invalid {\\n  color: #F8F8F0;\\n  background-color: #F92672\\n}\\n\\n.ace-monokai .ace_invalid.ace_deprecated {\\n  color: #F8F8F0;\\n  background-color: #AE81FF\\n}\\n\\n.ace-monokai .ace_support.ace_constant,\\n.ace-monokai .ace_support.ace_function {\\n  color: #66D9EF\\n}\\n\\n.ace-monokai .ace_fold {\\n  background-color: #A6E22E;\\n  border-color: #F8F8F2\\n}\\n\\n.ace-monokai .ace_storage.ace_type,\\n.ace-monokai .ace_support.ace_class,\\n.ace-monokai .ace_support.ace_type {\\n  font-style: italic;\\n  color: #66D9EF\\n}\\n\\n.ace-monokai .ace_entity.ace_name.ace_function,\\n.ace-monokai .ace_entity.ace_other,\\n.ace-monokai .ace_entity.ace_other.ace_attribute-name,\\n.ace-monokai .ace_variable {\\n  color: #A6E22E\\n}\\n\\n.ace-monokai .ace_variable.ace_parameter {\\n  font-style: italic;\\n  color: #FD971F\\n}\\n\\n.ace-monokai .ace_string {\\n  color: #E6DB74\\n}\\n\\n.ace-monokai .ace_comment {\\n  color: #75715E\\n}\\n\\n.ace-monokai .ace_indent-guide {\\n  background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQImWPQ0FD0ZXBzd/wPAAjVAoxeSgNeAAAAAElFTkSuQmCC) right repeat-y\\n}\\n\\n.ace-monokai .ace_indent-guide-active {\\n  background: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAACCAYAAACZgbYnAAAAEklEQVQIW2PQ1dX9zzBz5sz/ABCcBFFentLlAAAAAElFTkSuQmCC) right repeat-y;\\n}\\n\";\n});\n\ndefine(\"ace/theme/monokai\", [\n  \"require\",\n  \"exports\",\n  \"module\",\n  \"ace/theme/monokai-css\",\n  \"ace/lib/dom\",\n], function (require, exports, module) {\n  exports.isDark = true;\n  exports.cssClass = \"ace-monokai\";\n  exports.cssText = require(\"./monokai-css\");\n  var dom = require(\"../lib/dom\");\n  dom.importCssString(exports.cssText, exports.cssClass, false);\n});\n(function () {\n  window.require([\"ace/theme/monokai\"], function (m) {\n    if (typeof module == \"object\" && typeof exports == \"object\" && module) {\n      module.exports = m;\n    }\n  });\n})();\n"], "file": "/web/assets/d307fa6/web.ace_lib.js", "sourceRoot": "../../../"}