ace.define("ace/mode/tex_highlight_rules", ["require", "exports", "module", "ace/lib/oop", "ace/lib/lang", "ace/mode/text_highlight_rules"], function (require, exports, module) {
    "use strict";

    var oop = require("../lib/oop");
    var lang = require("../lib/lang");
    var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;

    var TexHighlightRules = function (textClass) {

        if (!textClass)
            textClass = "text";

        this.$rules = {
            "start": [
                {
                    token: "comment",
                    regex: "%.*$"
                }, {
                    token: textClass, // non-command
                    regex: "\\\\[$&%#\\{\\}]"
                }, {
                    token: "keyword", // command
                    regex: "\\\\(?:documentclass|usepackage|newcounter|setcounter|addtocounter|value|arabic|stepcounter|newenvironment|renewenvironment|ref|vref|eqref|pageref|label|cite[a-zA-Z]*|tag|begin|end|bibitem)\\b",
                    next: "nospell"
                }, {
                    token: "keyword", // command
                    regex: "\\\\(?:[a-zA-z0-9]+|[^a-zA-z0-9])"
                }, {
                    token: "paren.keyword.operator",
                    regex: "[[({]"
                }, {
                    token: "paren.keyword.operator",
                    regex: "[\\])}]"
                }, {
                    token: textClass,
                    regex: "\\s+"
                }
            ],
            "nospell": [
                {
                    token: "comment",
                    regex: "%.*$",
                    next: "start"
                }, {
                    token: "nospell." + textClass, // non-command
                    regex: "\\\\[$&%#\\{\\}]"
                }, {
                    token: "keyword", // command
                    regex: "\\\\(?:documentclass|usepackage|newcounter|setcounter|addtocounter|value|arabic|stepcounter|newenvironment|renewenvironment|ref|vref|eqref|pageref|label|cite[a-zA-Z]*|tag|begin|end|bibitem)\\b"
                }, {
                    token: "keyword", // command
                    regex: "\\\\(?:[a-zA-z0-9]+|[^a-zA-z0-9])",
                    next: "start"
                }, {
                    token: "paren.keyword.operator",
                    regex: "[[({]"
                }, {
                    token: "paren.keyword.operator",
                    regex: "[\\])]"
                }, {
                    token: "paren.keyword.operator",
                    regex: "}",
                    next: "start"
                }, {
                    token: "nospell." + textClass,
                    regex: "\\s+"
                }, {
                    token: "nospell." + textClass,
                    regex: "\\w+"
                }
            ]
        };
    };

    oop.inherits(TexHighlightRules, TextHighlightRules);

    exports.TexHighlightRules = TexHighlightRules;
});

ace.define("ace/mode/matching_brace_outdent", ["require", "exports", "module", "ace/range"], function (require, exports, module) {
    "use strict";

    var Range = require("../range").Range;

    var MatchingBraceOutdent = function () {
    };

    (function () {

        this.checkOutdent = function (line, input) {
            if (!/^\s+$/.test(line))
                return false;

            return /^\s*\}/.test(input);
        };

        this.autoOutdent = function (doc, row) {
            var line = doc.getLine(row);
            var match = line.match(/^(\s*\})/);

            if (!match) return 0;

            var column = match[1].length;
            var openBracePos = doc.findMatchingBracket({row: row, column: column});

            if (!openBracePos || openBracePos.row == row) return 0;

            var indent = this.$getIndent(doc.getLine(openBracePos.row));
            doc.replace(new Range(row, 0, row, column - 1), indent);
        };

        this.$getIndent = function (line) {
            return line.match(/^\s*/)[0];
        };

    }).call(MatchingBraceOutdent.prototype);

    exports.MatchingBraceOutdent = MatchingBraceOutdent;
});

ace.define("ace/mode/tex", ["require", "exports", "module", "ace/lib/oop", "ace/mode/text", "ace/mode/text_highlight_rules", "ace/mode/tex_highlight_rules", "ace/mode/matching_brace_outdent"], function (require, exports, module) {
    "use strict";

    var oop = require("../lib/oop");
    var TextMode = require("./text").Mode;
    var TextHighlightRules = require("./text_highlight_rules").TextHighlightRules;
    var TexHighlightRules = require("./tex_highlight_rules").TexHighlightRules;
    var MatchingBraceOutdent = require("./matching_brace_outdent").MatchingBraceOutdent;

    var Mode = function (suppressHighlighting) {
        if (suppressHighlighting)
            this.HighlightRules = TextHighlightRules;
        else
            this.HighlightRules = TexHighlightRules;
        this.$outdent = new MatchingBraceOutdent();
    };
    oop.inherits(Mode, TextMode);

    (function () {
        this.getNextLineIndent = function (state, line, tab) {
            return this.$getIndent(line);
        };

        this.allowAutoInsert = function () {
            return false;
        };
        this.$id = "ace/mode/tex";
    }).call(Mode.prototype);

    exports.Mode = Mode;
});
