Clean up vendor.
authorDavid Schoonover <dsc@wikimedia.org>
Fri, 13 Jul 2012 09:27:43 +0000 (02:27 -0700)
committerDavid Schoonover <dsc@wikimedia.org>
Fri, 13 Jul 2012 09:27:59 +0000 (02:27 -0700)
102 files changed:
package.co
package.json
src/server/middleware.co
src/server/proxy.co
static/vendor/backbone-0.5.3.js [deleted file]
static/vendor/backbone-0.5.3.min.js [deleted file]
static/vendor/backbone-0.9.1.js [deleted file]
static/vendor/backbone-0.9.1.min.js [deleted file]
static/vendor/backbone-0.9.2.js [deleted file]
static/vendor/backbone-0.9.2.min.js [deleted file]
static/vendor/backbone-0.9.2.mod.js [deleted file]
static/vendor/backbone-0.9.2.mod.min.js [deleted file]
static/vendor/backbone.js [changed from symlink to file mode: 0000->0644]
static/vendor/backbone.min.js [changed from symlink to file mode: 0000->0644]
static/vendor/backbone.mod.js [changed from symlink to file mode: 0000->0644]
static/vendor/backbone.mod.min.js [changed from symlink to file mode: 0000->0644]
static/vendor/backbone.nested-1.1.0.js [deleted file]
static/vendor/backbone.nested-1.1.0.min.js [deleted file]
static/vendor/backbone.nested.js [changed from symlink to file mode: 0000->0644]
static/vendor/backbone.nested.min.js [changed from symlink to file mode: 0000->0644]
static/vendor/bootstrap [deleted symlink]
static/vendor/bootstrap-2.0.1/css/bootstrap-responsive.css [deleted file]
static/vendor/bootstrap-2.0.1/css/bootstrap-responsive.min.css [deleted file]
static/vendor/bootstrap-2.0.1/css/bootstrap.css [deleted file]
static/vendor/bootstrap-2.0.1/css/bootstrap.min.css [deleted file]
static/vendor/bootstrap-2.0.1/img/glyphicons-halflings-white.png [deleted file]
static/vendor/bootstrap-2.0.1/img/glyphicons-halflings.png [deleted file]
static/vendor/bootstrap-2.0.1/js/bootstrap.js [deleted file]
static/vendor/bootstrap-2.0.1/js/bootstrap.min.js [deleted file]
static/vendor/bootstrap-2.0.2/css/bootstrap-responsive.min.css [deleted file]
static/vendor/bootstrap-2.0.2/css/bootstrap.min.css [deleted file]
static/vendor/bootstrap-2.0.2/img/glyphicons-halflings-white.png [deleted file]
static/vendor/bootstrap-2.0.2/img/glyphicons-halflings.png [deleted file]
static/vendor/bootstrap-2.0.2/js/bootstrap.min.js [deleted file]
static/vendor/bootstrap/css/bootstrap-responsive.css [moved from static/vendor/bootstrap-2.0.2/css/bootstrap-responsive.css with 58% similarity]
static/vendor/bootstrap/css/bootstrap-responsive.min.css [new file with mode: 0644]
static/vendor/bootstrap/css/bootstrap.css [moved from static/vendor/bootstrap-2.0.2/css/bootstrap.css with 76% similarity]
static/vendor/bootstrap/css/bootstrap.min.css [new file with mode: 0644]
static/vendor/bootstrap/img/glyphicons-halflings-white.png [new file with mode: 0644]
static/vendor/bootstrap/img/glyphicons-halflings.png [new file with mode: 0644]
static/vendor/bootstrap/js/bootstrap.js [moved from static/vendor/bootstrap-2.0.2/js/bootstrap.js with 79% similarity]
static/vendor/bootstrap/js/bootstrap.min.js [new file with mode: 0644]
static/vendor/dygraph-extra.js [changed mode: 0755->0644]
static/vendor/jquery-1.7.1.js [deleted file]
static/vendor/jquery-1.7.1.min.js [deleted file]
static/vendor/jquery.history-1.7.0.min.js [deleted file]
static/vendor/jquery.history-1.7.1rc2.js [deleted file]
static/vendor/jquery.history-1.7.1rc2.min.js [deleted file]
static/vendor/jquery.history.js [changed from symlink to file mode: 0000->0644]
static/vendor/jquery.history.min.js [changed from symlink to file mode: 0000->0644]
static/vendor/jquery.isotope-1.5.11.js [deleted file]
static/vendor/jquery.isotope-1.5.11.min.js [deleted file]
static/vendor/jquery.isotope.js [changed from symlink to file mode: 0000->0644]
static/vendor/jquery.isotope.min.js [changed from symlink to file mode: 0000->0644]
static/vendor/jquery.js [changed from symlink to file mode: 0000->0644]
static/vendor/jquery.min.js [changed from symlink to file mode: 0000->0644]
static/vendor/jquery.spin.js [changed from symlink to file mode: 0000->0644]
static/vendor/jquery.spin.min.js [changed from symlink to file mode: 0000->0644]
static/vendor/modernizr-2.0.6.js [deleted file]
static/vendor/modernizr-2.0.6.min.js [deleted file]
static/vendor/modernizr.js [changed from symlink to file mode: 0000->0644]
static/vendor/modernizr.min.js [changed from symlink to file mode: 0000->0644]
static/vendor/moment-1.4.0.js [deleted file]
static/vendor/moment-1.4.0.min.js [deleted file]
static/vendor/moment-1.4.0.mod.js [deleted file]
static/vendor/moment-1.4.0.mod.min.js [deleted file]
static/vendor/moment.js [changed from symlink to file mode: 0000->0644]
static/vendor/moment.min.js [changed from symlink to file mode: 0000->0644]
static/vendor/moment.mod.js [changed from symlink to file mode: 0000->0644]
static/vendor/moment.mod.min.js [changed from symlink to file mode: 0000->0644]
static/vendor/require.js [new file with mode: 0644]
static/vendor/require.min.js [new file with mode: 0644]
static/vendor/spin [deleted symlink]
static/vendor/spin-1.2.0/jquery.spin.js [deleted file]
static/vendor/spin-1.2.0/jquery.spin.min.js [deleted file]
static/vendor/spin-1.2.0/spin.js [deleted file]
static/vendor/spin-1.2.0/spin.min.js [deleted file]
static/vendor/spin-1.2.5/jquery.spin.js [deleted file]
static/vendor/spin-1.2.5/jquery.spin.min.js [deleted file]
static/vendor/spin-1.2.5/spin.js [deleted file]
static/vendor/spin-1.2.5/spin.min.js [deleted file]
static/vendor/spin.js [changed from symlink to file mode: 0000->0644]
static/vendor/spin.min.js [changed from symlink to file mode: 0000->0644]
static/vendor/underscore-1.2.3.js [deleted file]
static/vendor/underscore-1.2.3.min.js [deleted file]
static/vendor/underscore-1.3.1.js [deleted file]
static/vendor/underscore-1.3.1.min.js [deleted file]
static/vendor/underscore-1.3.1.mod.js [deleted file]
static/vendor/underscore-1.3.1.mod.min.js [deleted file]
static/vendor/underscore.js [changed from symlink to file mode: 0000->0644]
static/vendor/underscore.min.js [changed from symlink to file mode: 0000->0644]
static/vendor/underscore.mod.js [deleted symlink]
static/vendor/underscore.mod.min.js [deleted symlink]
static/vendor/underscore.string-2.0.0.js [deleted file]
static/vendor/underscore.string-2.0.0.min.js [deleted file]
static/vendor/underscore.string-2.0.0.mod.js [deleted file]
static/vendor/underscore.string-2.0.0.mod.min.js [deleted file]
static/vendor/underscore.string.js [changed from symlink to file mode: 0000->0644]
static/vendor/underscore.string.min.js [changed from symlink to file mode: 0000->0644]
static/vendor/underscore.string.mod.js [changed from symlink to file mode: 0000->0644]
static/vendor/underscore.string.mod.min.js [changed from symlink to file mode: 0000->0644]
static/vendor/versions.yaml [new file with mode: 0644]

index c00dd63..e66f2d6 100644 (file)
@@ -20,7 +20,7 @@ dependencies                    :
     'underscore'                : '== 1.3.x'
     'underscore.string'         : '== 2.1.1'
     'seq'                       : '== 0.3.5'
-    'backbone'                  : '== 0.9.1'
+    'backbone'                  : '== 0.9.2'
     'express'                   : '== 2.5.11'
     'express-resource'          : '== 0.2.4'
     'request'                   : '== 2.9.x'
index d5763fd..b3474fa 100644 (file)
@@ -21,7 +21,7 @@
     "underscore": "== 1.3.x",
     "underscore.string": "== 2.1.1",
     "seq": "== 0.3.5",
-    "backbone": "== 0.9.1",
+    "backbone": "== 0.9.2",
     "express": "== 2.5.11",
     "express-resource": "== 0.2.4",
     "request": "== 2.9.x",
index d193129..327baec 100755 (executable)
@@ -139,9 +139,7 @@ application = limn.application =
         opx.enabled = true if opx.enabled is false and (opx.whitelist or opx.blacklist)
         if opx.enabled
             opx.whitelist or= [ /.*/ ]
-            opx.whitelist = [opx.whitelist] unless _.isArray opx.whitelist
             opx.blacklist or= []
-            opx.blacklist = [opx.blacklist] unless _.isArray opx.blacklist
         @set 'limn options', opts
         
         # create data directory
@@ -223,19 +221,19 @@ application = limn.application =
             
             # wrap modules in commonjs closure for browser
             @use compiler do
-                enabled : 'commonjs_define'
+                enabled : <[ amd commonjs_define ]>
                 src     : [ STATIC ]
                 dest    : varDir
                 options :
-                    commonjs        : { drop_path_parts:1, drop_full_ext:false }
+                    amd             : { drop_path_parts:1, drop_full_ext:false }
                     commonjs_define : { drop_path_parts:1, drop_full_ext:false }
                 log_level : LOG_LEVEL
             @use compiler do
-                enabled : 'commonjs_define'
+                enabled : <[ amd commonjs_define ]>
                 src     : [ varDir, WWW ]
                 dest    : varDir
                 options :
-                    commonjs        : { drop_path_parts:1, drop_full_ext:true }
+                    amd             : { drop_path_parts:1, drop_full_ext:true }
                     commonjs_define : { drop_path_parts:1, drop_full_ext:true }
                 log_level : LOG_LEVEL
         
index 8dafdf6..a4331f0 100644 (file)
@@ -1,4 +1,3 @@
-_         = require 'underscore'
 url       = require 'url'
 minimatch = require 'minimatch'
 request   = require 'request'
@@ -10,8 +9,10 @@ matchesList = (list, value) ->
     false
 
 ProxyMiddleware = (options={}) ->
-    {whitelist, blacklist} = options = {whitelist:[], blacklist:[], ...options}
+    options = {whitelist, blacklist} = {-verbose, whitelist:[], blacklist:[], ...options}
+    whitelist = [whitelist] unless Array.isArray whitelist
     whitelist .= map -> minimatch.filter it, {+nocase}
+    blacklist = [blacklist] unless Array.isArray blacklist
     blacklist .= map -> minimatch.filter it, {+nocase}
     
     return (req, res) ->
@@ -29,7 +30,7 @@ ProxyMiddleware = (options={}) ->
         # Set the no-buffering flag for nginx
         res.header 'X-Accel-Buffering', 'no'
         
-        console.log "[Proxy] #targetUrl"
+        console.log "[Proxy] #targetUrl" if options.verbose
         request.get targetUrl .pipe res
 
 
diff --git a/static/vendor/backbone-0.5.3.js b/static/vendor/backbone-0.5.3.js
deleted file mode 100644 (file)
index b2e4932..0000000
+++ /dev/null
@@ -1,1158 +0,0 @@
-//     Backbone.js 0.5.3
-//     (c) 2010 Jeremy Ashkenas, DocumentCloud Inc.
-//     Backbone may be freely distributed under the MIT license.
-//     For all details and documentation:
-//     http://documentcloud.github.com/backbone
-
-(function(){
-
-  // Initial Setup
-  // -------------
-
-  // Save a reference to the global object.
-  var root = this;
-
-  // Save the previous value of the `Backbone` variable.
-  var previousBackbone = root.Backbone;
-
-  // The top-level namespace. All public Backbone classes and modules will
-  // be attached to this. Exported for both CommonJS and the browser.
-  var Backbone;
-  if (typeof exports !== 'undefined') {
-    Backbone = exports;
-  } else {
-    Backbone = root.Backbone = {};
-  }
-
-  // Current version of the library. Keep in sync with `package.json`.
-  Backbone.VERSION = '0.5.3';
-
-  // Require Underscore, if we're on the server, and it's not already present.
-  var _ = root._;
-  if (!_ && (typeof require !== 'undefined')) _ = require('underscore')._;
-
-  // For Backbone's purposes, jQuery or Zepto owns the `$` variable.
-  var $ = root.jQuery || root.Zepto;
-
-  // Runs Backbone.js in *noConflict* mode, returning the `Backbone` variable
-  // to its previous owner. Returns a reference to this Backbone object.
-  Backbone.noConflict = function() {
-    root.Backbone = previousBackbone;
-    return this;
-  };
-
-  // Turn on `emulateHTTP` to support legacy HTTP servers. Setting this option will
-  // fake `"PUT"` and `"DELETE"` requests via the `_method` parameter and set a
-  // `X-Http-Method-Override` header.
-  Backbone.emulateHTTP = false;
-
-  // Turn on `emulateJSON` to support legacy servers that can't deal with direct
-  // `application/json` requests ... will encode the body as
-  // `application/x-www-form-urlencoded` instead and will send the model in a
-  // form param named `model`.
-  Backbone.emulateJSON = false;
-
-  // Backbone.Events
-  // -----------------
-
-  // A module that can be mixed in to *any object* in order to provide it with
-  // custom events. You may `bind` or `unbind` a callback function to an event;
-  // `trigger`-ing an event fires all callbacks in succession.
-  //
-  //     var object = {};
-  //     _.extend(object, Backbone.Events);
-  //     object.bind('expand', function(){ alert('expanded'); });
-  //     object.trigger('expand');
-  //
-  Backbone.Events = {
-
-    // Bind an event, specified by a string name, `ev`, to a `callback` function.
-    // Passing `"all"` will bind the callback to all events fired.
-    bind : function(ev, callback, context) {
-      var calls = this._callbacks || (this._callbacks = {});
-      var list  = calls[ev] || (calls[ev] = []);
-      list.push([callback, context]);
-      return this;
-    },
-
-    // Remove one or many callbacks. If `callback` is null, removes all
-    // callbacks for the event. If `ev` is null, removes all bound callbacks
-    // for all events.
-    unbind : function(ev, callback) {
-      var calls;
-      if (!ev) {
-        this._callbacks = {};
-      } else if (calls = this._callbacks) {
-        if (!callback) {
-          calls[ev] = [];
-        } else {
-          var list = calls[ev];
-          if (!list) return this;
-          for (var i = 0, l = list.length; i < l; i++) {
-            if (list[i] && callback === list[i][0]) {
-              list[i] = null;
-              break;
-            }
-          }
-        }
-      }
-      return this;
-    },
-
-    // Trigger an event, firing all bound callbacks. Callbacks are passed the
-    // same arguments as `trigger` is, apart from the event name.
-    // Listening for `"all"` passes the true event name as the first argument.
-    trigger : function(eventName) {
-      var list, calls, ev, callback, args;
-      var both = 2;
-      if (!(calls = this._callbacks)) return this;
-      while (both--) {
-        ev = both ? eventName : 'all';
-        if (list = calls[ev]) {
-          for (var i = 0, l = list.length; i < l; i++) {
-            if (!(callback = list[i])) {
-              list.splice(i, 1); i--; l--;
-            } else {
-              args = both ? Array.prototype.slice.call(arguments, 1) : arguments;
-              callback[0].apply(callback[1] || this, args);
-            }
-          }
-        }
-      }
-      return this;
-    }
-
-  };
-
-  // Backbone.Model
-  // --------------
-
-  // Create a new model, with defined attributes. A client id (`cid`)
-  // is automatically generated and assigned for you.
-  Backbone.Model = function(attributes, options) {
-    var defaults;
-    attributes || (attributes = {});
-    if (defaults = this.defaults) {
-      if (_.isFunction(defaults)) defaults = defaults.call(this);
-      attributes = _.extend({}, defaults, attributes);
-    }
-    this.attributes = {};
-    this._escapedAttributes = {};
-    this.cid = _.uniqueId('c');
-    this.set(attributes, {silent : true});
-    this._changed = false;
-    this._previousAttributes = _.clone(this.attributes);
-    if (options && options.collection) this.collection = options.collection;
-    this.initialize(attributes, options);
-  };
-
-  // Attach all inheritable methods to the Model prototype.
-  _.extend(Backbone.Model.prototype, Backbone.Events, {
-
-    // A snapshot of the model's previous attributes, taken immediately
-    // after the last `"change"` event was fired.
-    _previousAttributes : null,
-
-    // Has the item been changed since the last `"change"` event?
-    _changed : false,
-
-    // The default name for the JSON `id` attribute is `"id"`. MongoDB and
-    // CouchDB users may want to set this to `"_id"`.
-    idAttribute : 'id',
-
-    // Initialize is an empty function by default. Override it with your own
-    // initialization logic.
-    initialize : function(){},
-
-    // Return a copy of the model's `attributes` object.
-    toJSON : function() {
-      return _.clone(this.attributes);
-    },
-
-    // Get the value of an attribute.
-    get : function(attr) {
-      return this.attributes[attr];
-    },
-
-    // Get the HTML-escaped value of an attribute.
-    escape : function(attr) {
-      var html;
-      if (html = this._escapedAttributes[attr]) return html;
-      var val = this.attributes[attr];
-      return this._escapedAttributes[attr] = escapeHTML(val == null ? '' : '' + val);
-    },
-
-    // Returns `true` if the attribute contains a value that is not null
-    // or undefined.
-    has : function(attr) {
-      return this.attributes[attr] != null;
-    },
-
-    // Set a hash of model attributes on the object, firing `"change"` unless you
-    // choose to silence it.
-    set : function(attrs, options) {
-
-      // Extract attributes and options.
-      options || (options = {});
-      if (!attrs) return this;
-      if (attrs.attributes) attrs = attrs.attributes;
-      var now = this.attributes, escaped = this._escapedAttributes;
-
-      // Run validation.
-      if (!options.silent && this.validate && !this._performValidation(attrs, options)) return false;
-
-      // Check for changes of `id`.
-      if (this.idAttribute in attrs) this.id = attrs[this.idAttribute];
-
-      // We're about to start triggering change events.
-      var alreadyChanging = this._changing;
-      this._changing = true;
-
-      // Update attributes.
-      for (var attr in attrs) {
-        var val = attrs[attr];
-        if (!_.isEqual(now[attr], val)) {
-          now[attr] = val;
-          delete escaped[attr];
-          this._changed = true;
-          if (!options.silent) this.trigger('change:' + attr, this, val, options);
-        }
-      }
-
-      // Fire the `"change"` event, if the model has been changed.
-      if (!alreadyChanging && !options.silent && this._changed) this.change(options);
-      this._changing = false;
-      return this;
-    },
-
-    // Remove an attribute from the model, firing `"change"` unless you choose
-    // to silence it. `unset` is a noop if the attribute doesn't exist.
-    unset : function(attr, options) {
-      if (!(attr in this.attributes)) return this;
-      options || (options = {});
-      var value = this.attributes[attr];
-
-      // Run validation.
-      var validObj = {};
-      validObj[attr] = void 0;
-      if (!options.silent && this.validate && !this._performValidation(validObj, options)) return false;
-
-      // Remove the attribute.
-      delete this.attributes[attr];
-      delete this._escapedAttributes[attr];
-      if (attr == this.idAttribute) delete this.id;
-      this._changed = true;
-      if (!options.silent) {
-        this.trigger('change:' + attr, this, void 0, options);
-        this.change(options);
-      }
-      return this;
-    },
-
-    // Clear all attributes on the model, firing `"change"` unless you choose
-    // to silence it.
-    clear : function(options) {
-      options || (options = {});
-      var attr;
-      var old = this.attributes;
-
-      // Run validation.
-      var validObj = {};
-      for (attr in old) validObj[attr] = void 0;
-      if (!options.silent && this.validate && !this._performValidation(validObj, options)) return false;
-
-      this.attributes = {};
-      this._escapedAttributes = {};
-      this._changed = true;
-      if (!options.silent) {
-        for (attr in old) {
-          this.trigger('change:' + attr, this, void 0, options);
-        }
-        this.change(options);
-      }
-      return this;
-    },
-
-    // Fetch the model from the server. If the server's representation of the
-    // model differs from its current attributes, they will be overriden,
-    // triggering a `"change"` event.
-    fetch : function(options) {
-      options || (options = {});
-      var model = this;
-      var success = options.success;
-      options.success = function(resp, status, xhr) {
-        if (!model.set(model.parse(resp, xhr), options)) return false;
-        if (success) success(model, resp);
-      };
-      options.error = wrapError(options.error, model, options);
-      return (this.sync || Backbone.sync).call(this, 'read', this, options);
-    },
-
-    // Set a hash of model attributes, and sync the model to the server.
-    // If the server returns an attributes hash that differs, the model's
-    // state will be `set` again.
-    save : function(attrs, options) {
-      options || (options = {});
-      if (attrs && !this.set(attrs, options)) return false;
-      var model = this;
-      var success = options.success;
-      options.success = function(resp, status, xhr) {
-        if (!model.set(model.parse(resp, xhr), options)) return false;
-        if (success) success(model, resp, xhr);
-      };
-      options.error = wrapError(options.error, model, options);
-      var method = this.isNew() ? 'create' : 'update';
-      return (this.sync || Backbone.sync).call(this, method, this, options);
-    },
-
-    // Destroy this model on the server if it was already persisted. Upon success, the model is removed
-    // from its collection, if it has one.
-    destroy : function(options) {
-      options || (options = {});
-      if (this.isNew()) return this.trigger('destroy', this, this.collection, options);
-      var model = this;
-      var success = options.success;
-      options.success = function(resp) {
-        model.trigger('destroy', model, model.collection, options);
-        if (success) success(model, resp);
-      };
-      options.error = wrapError(options.error, model, options);
-      return (this.sync || Backbone.sync).call(this, 'delete', this, options);
-    },
-
-    // Default URL for the model's representation on the server -- if you're
-    // using Backbone's restful methods, override this to change the endpoint
-    // that will be called.
-    url : function() {
-      var base = getUrl(this.collection) || this.urlRoot || urlError();
-      if (this.isNew()) return base;
-      return base + (base.charAt(base.length - 1) == '/' ? '' : '/') + encodeURIComponent(this.id);
-    },
-
-    // **parse** converts a response into the hash of attributes to be `set` on
-    // the model. The default implementation is just to pass the response along.
-    parse : function(resp, xhr) {
-      return resp;
-    },
-
-    // Create a new model with identical attributes to this one.
-    clone : function() {
-      return new this.constructor(this);
-    },
-
-    // A model is new if it has never been saved to the server, and lacks an id.
-    isNew : function() {
-      return this.id == null;
-    },
-
-    // Call this method to manually fire a `change` event for this model.
-    // Calling this will cause all objects observing the model to update.
-    change : function(options) {
-      this.trigger('change', this, options);
-      this._previousAttributes = _.clone(this.attributes);
-      this._changed = false;
-    },
-
-    // Determine if the model has changed since the last `"change"` event.
-    // If you specify an attribute name, determine if that attribute has changed.
-    hasChanged : function(attr) {
-      if (attr) return this._previousAttributes[attr] != this.attributes[attr];
-      return this._changed;
-    },
-
-    // Return an object containing all the attributes that have changed, or false
-    // if there are no changed attributes. Useful for determining what parts of a
-    // view need to be updated and/or what attributes need to be persisted to
-    // the server.
-    changedAttributes : function(now) {
-      now || (now = this.attributes);
-      var old = this._previousAttributes;
-      var changed = false;
-      for (var attr in now) {
-        if (!_.isEqual(old[attr], now[attr])) {
-          changed = changed || {};
-          changed[attr] = now[attr];
-        }
-      }
-      return changed;
-    },
-
-    // Get the previous value of an attribute, recorded at the time the last
-    // `"change"` event was fired.
-    previous : function(attr) {
-      if (!attr || !this._previousAttributes) return null;
-      return this._previousAttributes[attr];
-    },
-
-    // Get all of the attributes of the model at the time of the previous
-    // `"change"` event.
-    previousAttributes : function() {
-      return _.clone(this._previousAttributes);
-    },
-
-    // Run validation against a set of incoming attributes, returning `true`
-    // if all is well. If a specific `error` callback has been passed,
-    // call that instead of firing the general `"error"` event.
-    _performValidation : function(attrs, options) {
-      var error = this.validate(attrs);
-      if (error) {
-        if (options.error) {
-          options.error(this, error, options);
-        } else {
-          this.trigger('error', this, error, options);
-        }
-        return false;
-      }
-      return true;
-    }
-
-  });
-
-  // Backbone.Collection
-  // -------------------
-
-  // Provides a standard collection class for our sets of models, ordered
-  // or unordered. If a `comparator` is specified, the Collection will maintain
-  // its models in sort order, as they're added and removed.
-  Backbone.Collection = function(models, options) {
-    options || (options = {});
-    if (options.comparator) this.comparator = options.comparator;
-    _.bindAll(this, '_onModelEvent', '_removeReference');
-    this._reset();
-    if (models) this.reset(models, {silent: true});
-    this.initialize.apply(this, arguments);
-  };
-
-  // Define the Collection's inheritable methods.
-  _.extend(Backbone.Collection.prototype, Backbone.Events, {
-
-    // The default model for a collection is just a **Backbone.Model**.
-    // This should be overridden in most cases.
-    model : Backbone.Model,
-
-    // Initialize is an empty function by default. Override it with your own
-    // initialization logic.
-    initialize : function(){},
-
-    // The JSON representation of a Collection is an array of the
-    // models' attributes.
-    toJSON : function() {
-      return this.map(function(model){ return model.toJSON(); });
-    },
-
-    // Add a model, or list of models to the set. Pass **silent** to avoid
-    // firing the `added` event for every new model.
-    add : function(models, options) {
-      if (_.isArray(models)) {
-        for (var i = 0, l = models.length; i < l; i++) {
-          this._add(models[i], options);
-        }
-      } else {
-        this._add(models, options);
-      }
-      return this;
-    },
-
-    // Remove a model, or a list of models from the set. Pass silent to avoid
-    // firing the `removed` event for every model removed.
-    remove : function(models, options) {
-      if (_.isArray(models)) {
-        for (var i = 0, l = models.length; i < l; i++) {
-          this._remove(models[i], options);
-        }
-      } else {
-        this._remove(models, options);
-      }
-      return this;
-    },
-
-    // Get a model from the set by id.
-    get : function(id) {
-      if (id == null) return null;
-      return this._byId[id.id != null ? id.id : id];
-    },
-
-    // Get a model from the set by client id.
-    getByCid : function(cid) {
-      return cid && this._byCid[cid.cid || cid];
-    },
-
-    // Get the model at the given index.
-    at: function(index) {
-      return this.models[index];
-    },
-
-    // Force the collection to re-sort itself. You don't need to call this under normal
-    // circumstances, as the set will maintain sort order as each item is added.
-    sort : function(options) {
-      options || (options = {});
-      if (!this.comparator) throw new Error('Cannot sort a set without a comparator');
-      this.models = this.sortBy(this.comparator);
-      if (!options.silent) this.trigger('reset', this, options);
-      return this;
-    },
-
-    // Pluck an attribute from each model in the collection.
-    pluck : function(attr) {
-      return _.map(this.models, function(model){ return model.get(attr); });
-    },
-
-    // When you have more items than you want to add or remove individually,
-    // you can reset the entire set with a new list of models, without firing
-    // any `added` or `removed` events. Fires `reset` when finished.
-    reset : function(models, options) {
-      models  || (models = []);
-      options || (options = {});
-      this.each(this._removeReference);
-      this._reset();
-      this.add(models, {silent: true});
-      if (!options.silent) this.trigger('reset', this, options);
-      return this;
-    },
-
-    // Fetch the default set of models for this collection, resetting the
-    // collection when they arrive. If `add: true` is passed, appends the
-    // models to the collection instead of resetting.
-    fetch : function(options) {
-      options || (options = {});
-      var collection = this;
-      var success = options.success;
-      options.success = function(resp, status, xhr) {
-        collection[options.add ? 'add' : 'reset'](collection.parse(resp, xhr), options);
-        if (success) success(collection, resp);
-      };
-      options.error = wrapError(options.error, collection, options);
-      return (this.sync || Backbone.sync).call(this, 'read', this, options);
-    },
-
-    // Create a new instance of a model in this collection. After the model
-    // has been created on the server, it will be added to the collection.
-    // Returns the model, or 'false' if validation on a new model fails.
-    create : function(model, options) {
-      var coll = this;
-      options || (options = {});
-      model = this._prepareModel(model, options);
-      if (!model) return false;
-      var success = options.success;
-      options.success = function(nextModel, resp, xhr) {
-        coll.add(nextModel, options);
-        if (success) success(nextModel, resp, xhr);
-      };
-      model.save(null, options);
-      return model;
-    },
-
-    // **parse** converts a response into a list of models to be added to the
-    // collection. The default implementation is just to pass it through.
-    parse : function(resp, xhr) {
-      return resp;
-    },
-
-    // Proxy to _'s chain. Can't be proxied the same way the rest of the
-    // underscore methods are proxied because it relies on the underscore
-    // constructor.
-    chain: function () {
-      return _(this.models).chain();
-    },
-
-    // Reset all internal state. Called when the collection is reset.
-    _reset : function(options) {
-      this.length = 0;
-      this.models = [];
-      this._byId  = {};
-      this._byCid = {};
-    },
-
-    // Prepare a model to be added to this collection
-    _prepareModel: function(model, options) {
-      if (!(model instanceof Backbone.Model)) {
-        var attrs = model;
-        model = new this.model(attrs, {collection: this});
-        if (model.validate && !model._performValidation(attrs, options)) model = false;
-      } else if (!model.collection) {
-        model.collection = this;
-      }
-      return model;
-    },
-
-    // Internal implementation of adding a single model to the set, updating
-    // hash indexes for `id` and `cid` lookups.
-    // Returns the model, or 'false' if validation on a new model fails.
-    _add : function(model, options) {
-      options || (options = {});
-      model = this._prepareModel(model, options);
-      if (!model) return false;
-      var already = this.getByCid(model);
-      if (already) throw new Error(["Can't add the same model to a set twice", already.id]);
-      this._byId[model.id] = model;
-      this._byCid[model.cid] = model;
-      var index = options.at != null ? options.at :
-                  this.comparator ? this.sortedIndex(model, this.comparator) :
-                  this.length;
-      this.models.splice(index, 0, model);
-      model.bind('all', this._onModelEvent);
-      this.length++;
-      if (!options.silent) model.trigger('add', model, this, options);
-      return model;
-    },
-
-    // Internal implementation of removing a single model from the set, updating
-    // hash indexes for `id` and `cid` lookups.
-    _remove : function(model, options) {
-      options || (options = {});
-      model = this.getByCid(model) || this.get(model);
-      if (!model) return null;
-      delete this._byId[model.id];
-      delete this._byCid[model.cid];
-      this.models.splice(this.indexOf(model), 1);
-      this.length--;
-      if (!options.silent) model.trigger('remove', model, this, options);
-      this._removeReference(model);
-      return model;
-    },
-
-    // Internal method to remove a model's ties to a collection.
-    _removeReference : function(model) {
-      if (this == model.collection) {
-        delete model.collection;
-      }
-      model.unbind('all', this._onModelEvent);
-    },
-
-    // Internal method called every time a model in the set fires an event.
-    // Sets need to update their indexes when models change ids. All other
-    // events simply proxy through. "add" and "remove" events that originate
-    // in other collections are ignored.
-    _onModelEvent : function(ev, model, collection, options) {
-      if ((ev == 'add' || ev == 'remove') && collection != this) return;
-      if (ev == 'destroy') {
-        this._remove(model, options);
-      }
-      if (model && ev === 'change:' + model.idAttribute) {
-        delete this._byId[model.previous(model.idAttribute)];
-        this._byId[model.id] = model;
-      }
-      this.trigger.apply(this, arguments);
-    }
-
-  });
-
-  // Underscore methods that we want to implement on the Collection.
-  var methods = ['forEach', 'each', 'map', 'reduce', 'reduceRight', 'find', 'detect',
-    'filter', 'select', 'reject', 'every', 'all', 'some', 'any', 'include',
-    'contains', 'invoke', 'max', 'min', 'sortBy', 'sortedIndex', 'toArray', 'size',
-    'first', 'rest', 'last', 'without', 'indexOf', 'lastIndexOf', 'isEmpty', 'groupBy'];
-
-  // Mix in each Underscore method as a proxy to `Collection#models`.
-  _.each(methods, function(method) {
-    Backbone.Collection.prototype[method] = function() {
-      return _[method].apply(_, [this.models].concat(_.toArray(arguments)));
-    };
-  });
-
-  // Backbone.Router
-  // -------------------
-
-  // Routers map faux-URLs to actions, and fire events when routes are
-  // matched. Creating a new one sets its `routes` hash, if not set statically.
-  Backbone.Router = function(options) {
-    options || (options = {});
-    if (options.routes) this.routes = options.routes;
-    this._bindRoutes();
-    this.initialize.apply(this, arguments);
-  };
-
-  // Cached regular expressions for matching named param parts and splatted
-  // parts of route strings.
-  var namedParam    = /:([\w\d]+)/g;
-  var splatParam    = /\*([\w\d]+)/g;
-  var escapeRegExp  = /[-[\]{}()+?.,\\^$|#\s]/g;
-
-  // Set up all inheritable **Backbone.Router** properties and methods.
-  _.extend(Backbone.Router.prototype, Backbone.Events, {
-
-    // Initialize is an empty function by default. Override it with your own
-    // initialization logic.
-    initialize : function(){},
-
-    // Manually bind a single named route to a callback. For example:
-    //
-    //     this.route('search/:query/p:num', 'search', function(query, num) {
-    //       ...
-    //     });
-    //
-    route : function(route, name, callback) {
-      Backbone.history || (Backbone.history = new Backbone.History);
-      if (!_.isRegExp(route)) route = this._routeToRegExp(route);
-      Backbone.history.route(route, _.bind(function(fragment) {
-        var args = this._extractParameters(route, fragment);
-        callback.apply(this, args);
-        this.trigger.apply(this, ['route:' + name].concat(args));
-      }, this));
-    },
-
-    // Simple proxy to `Backbone.history` to save a fragment into the history.
-    navigate : function(fragment, triggerRoute) {
-      Backbone.history.navigate(fragment, triggerRoute);
-    },
-
-    // Bind all defined routes to `Backbone.history`. We have to reverse the
-    // order of the routes here to support behavior where the most general
-    // routes can be defined at the bottom of the route map.
-    _bindRoutes : function() {
-      if (!this.routes) return;
-      var routes = [];
-      for (var route in this.routes) {
-        routes.unshift([route, this.routes[route]]);
-      }
-      for (var i = 0, l = routes.length; i < l; i++) {
-        this.route(routes[i][0], routes[i][1], this[routes[i][1]]);
-      }
-    },
-
-    // Convert a route string into a regular expression, suitable for matching
-    // against the current location hash.
-    _routeToRegExp : function(route) {
-      route =&nb