// Generated by CoffeeScript 2.3.2
(function() {
  // This **Browser** compatibility layer extends core CoffeeScript functions
  // to make things work smoothly when compiling code directly in the browser.
  // We add support for loading remote Coffee scripts via **XHR**, and
  // `text/coffeescript` script tags, source maps via data-URLs, and so on.
  var CoffeeScript, compile, runScripts,
    indexOf = [].indexOf;

  CoffeeScript = require('./coffeescript');

  ({compile} = CoffeeScript);

  // Use `window.eval` to evaluate code, rather than just `eval`, to run the
  // script in a clean global scope rather than inheriting the scope of the
  // CoffeeScript compiler. (So that `cake test:browser` also works in Node,
  // use either `window.eval` or `global.eval` as appropriate).
  CoffeeScript.eval = function(code, options = {}) {
    var globalRoot;
    if (options.bare == null) {
      options.bare = true;
    }
    globalRoot = typeof window !== "undefined" && window !== null ? window : global;
    return globalRoot['eval'](compile(code, options));
  };

  // Running code does not provide access to this scope.
  CoffeeScript.run = function(code, options = {}) {
    options.bare = true;
    options.shiftLine = true;
    return Function(compile(code, options))();
  };

  // Export this more limited `CoffeeScript` than what is exported by
  // `index.coffee`, which is intended for a Node environment.
  module.exports = CoffeeScript;

  // If we’re not in a browser environment, we’re finished with the public API.
  if (typeof window === "undefined" || window === null) {
    return;
  }

  // Include source maps where possible. If we’ve got a base64 encoder, a
  // JSON serializer, and tools for escaping unicode characters, we’re good to go.
  // Ported from https://developer.mozilla.org/en-US/docs/DOM/window.btoa
  if ((typeof btoa !== "undefined" && btoa !== null) && (typeof JSON !== "undefined" && JSON !== null)) {
    compile = function(code, options = {}) {
      options.inlineMap = true;
      return CoffeeScript.compile(code, options);
    };
  }

  // Load a remote script from the current domain via XHR.
  CoffeeScript.load = function(url, callback, options = {}, hold = false) {
    var xhr;
    options.sourceFiles = [url];
    xhr = window.ActiveXObject ? new window.ActiveXObject('Microsoft.XMLHTTP') : new window.XMLHttpRequest();
    xhr.open('GET', url, true);
    if ('overrideMimeType' in xhr) {
      xhr.overrideMimeType('text/plain');
    }
    xhr.onreadystatechange = function() {
      var param, ref;
      if (xhr.readyState === 4) {
        if ((ref = xhr.status) === 0 || ref === 200) {
          param = [xhr.responseText, options];
          if (!hold) {
            CoffeeScript.run(...param);
          }
        } else {
          throw new Error(`Could not load ${url}`);
        }
        if (callback) {
          return callback(param);
        }
      }
    };
    return xhr.send(null);
  };

  // Activate CoffeeScript in the browser by having it compile and evaluate
  // all script tags with a content-type of `text/coffeescript`.
  // This happens on page load.
  runScripts = function() {
    var coffees, coffeetypes, execute, i, index, j, len, s, script, scripts;
    scripts = window.document.getElementsByTagName('script');
    coffeetypes = ['text/coffeescript', 'text/literate-coffeescript'];
    coffees = (function() {
      var j, len, ref, results;
      results = [];
      for (j = 0, len = scripts.length; j < len; j++) {
        s = scripts[j];
        if (ref = s.type, indexOf.call(coffeetypes, ref) >= 0) {
          results.push(s);
        }
      }
      return results;
    })();
    index = 0;
    execute = function() {
      var param;
      param = coffees[index];
      if (param instanceof Array) {
        CoffeeScript.run(...param);
        index++;
        return execute();
      }
    };
    for (i = j = 0, len = coffees.length; j < len; i = ++j) {
      script = coffees[i];
      (function(script, i) {
        var options, source;
        options = {
          literate: script.type === coffeetypes[1]
        };
        source = script.src || script.getAttribute('data-src');
        if (source) {
          options.filename = source;
          return CoffeeScript.load(source, function(param) {
            coffees[i] = param;
            return execute();
          }, options, true);
        } else {
          // `options.filename` defines the filename the source map appears as
          // in Developer Tools. If a script tag has an `id`, use that as the
          // filename; otherwise use `coffeescript`, or `coffeescript1` etc.,
          // leaving the first one unnumbered for the common case that there’s
          // only one CoffeeScript script block to parse.
          options.filename = script.id && script.id !== '' ? script.id : `coffeescript${(i !== 0 ? i : '')}`;
          options.sourceFiles = ['embedded'];
          return coffees[i] = [script.innerHTML, options];
        }
      })(script, i);
    }
    return execute();
  };

  // Listen for window load, both in decent browsers and in IE.
  if (window.addEventListener) {
    window.addEventListener('DOMContentLoaded', runScripts, false);
  } else {
    window.attachEvent('onload', runScripts);
  }

}).call(this);
